Иногда я нахожу 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;
}
}
Если ваш 'ListBox' является взаимоисключающим, вы можете проверить свойство' SelectedIndex', которое вернет индекс текущего объекта списка, поскольку выбранный выбор также выбран в текущий момент. –
@aus_lacy У меня есть две «ListBox» рядом друг с другом. Поэтому в обоих списках можно выбрать элемент - это не сработает. Или я не понимаю, что вы говорите? –
А я неправильно понял, что вы хотели сделать. Мое решение состоит в том, чтобы определить, какой элемент в данном «ListBox» выбран. Обычно вам нужно проверить, какой элемент ListBoxItem является в настоящее время ориентированным элементом пользовательского интерфейса, а затем определить, к какому элементу списка принадлежит ListBox, чтобы определить, у которого «ListBox» имеет текущий фокус. –