2015-04-14 4 views
0

Иногда я нахожу WPF немного разочаровывающим - есть ли способ найти текущий активный ListBox в UserControl от самого UserControl?Как найти в настоящее время сфокусированный ListBox

Что я хочу сделать, это иметь свойство в моем UserControl, которое возвращает ListBox, который в настоящее время сфокусирован на UserControl.

Я попытался это:

public ListBox FocusedListBox 
{ 
    if (listBox1.IsFocused) 
     return listBox1; 
    if (listBox2.IsFocused) 
     return listBox2; 
    return null; 
} 

Это не работает. Ни делает это:

public ListBox FocusedListBox 
{ 
    if (FocusManager.GetFocusedElement(this) == listBox1) 
     return listBox1; 
    if (FocusManager.GetFocusedElement(this) == listBox2) 
     return listBox2; 
    return null; 
} 

Или это:

public ListBox FocusedListBox 
{ 
    if (Keyboard.FocusedElement == listBox1) 
     return listBox1; 
    if (Keyboard.FocusedElement == listBox2) 
     return listBox2; 
    return null; 
} 

Так как я делаю это ??


Основываясь на ответе Джейсона Бойда, я действительно нашел решение. И я должен сказать, что все это очень мало интуитивное ... -.-

public ListBox FocusedListBox 
{ 
    get 
    { 
     var currentObject = Keyboard.FocusedElement as DependencyObject; 

     while (currentObject != null && currentObject != this && currentObject != Application.Current.MainWindow) 
     { 
      if (currentObject == listBox1|| currentObject == listBox2) 
      { 
       return currentObject as ListBox; 
      } 
      else 
      { 
       currentObject = VisualTreeHelper.GetParent(currentObject); 
      } 
     } 

     return null; 
    } 
} 
+0

Если ваш 'ListBox' является взаимоисключающим, вы можете проверить свойство' SelectedIndex', которое вернет индекс текущего объекта списка, поскольку выбранный выбор также выбран в текущий момент. –

+0

@aus_lacy У меня есть две «ListBox» рядом друг с другом. Поэтому в обоих списках можно выбрать элемент - это не сработает. Или я не понимаю, что вы говорите? –

+0

А я неправильно понял, что вы хотели сделать. Мое решение состоит в том, чтобы определить, какой элемент в данном «ListBox» выбран. Обычно вам нужно проверить, какой элемент ListBoxItem является в настоящее время ориентированным элементом пользовательского интерфейса, а затем определить, к какому элементу списка принадлежит ListBox, чтобы определить, у которого «ListBox» имеет текущий фокус. –

ответ

1

Что об этом:

public ListBox FocusedListBox() 
{ 
    DependencyObject currentObject = (UIElement)FocusManager.GetFocusedElement(this); 

    while(currentObject != Application.Current.MainWindow) 
    { 
     if(currentObject == listBox1 || currentObject == listBox2) 
     { 
      return currentObject as ListBox; 
     } 
     else 
     { 
      currentObject = LogicalTreeHelper.GetParent(currentObject); 
     } 
    } 

    return null; 
} 

Причина для ходьбы логического дерева является то, что он (более вероятно), а не сам список, который имеет фокус, но дочерний объект в списке.

+0

Фактически 'FocusManager.GetFocusedElement (this);' возвращает 'null' каждый раз. –

+0

Я предполагал, что 'this' был представлением/элементом управления, содержащим списки. Возможно, это было неправильное предположение. Вместо этого вы можете попробовать «FocusManager.GetFocusedElement (Application.Current.MainWindow)» или «Keyboard.FocusedElement». –

+0

Фактически, поля списка * * содержатся в пользовательском элементе управления, который находится внутри элемента управления вкладки, который находится внутри сетки главного окна, а значение 'this' фактически является пользовательским элементом управления. Я действительно не знаю, что происходит ... –

Смежные вопросы