Определите, кто имеет фокус в окне WPF

Мы используем WPF и имеем окно, полученное из DockingLibrary. В этом окне есть сетка с несколькими элементами, один из которых является сеткой данных WPF. Мы используем шаблон M-V-VM. Когда это окно создается и отображается, ни одна из строк в этой сетке данных не выбрана. Мы можем настроить отображение строки как выделенной, выполнив что-то вроде:

  SharedWindow.ShipmentWin.shipmentDataGrid.SelectedIndex = 0;

Это приводит к тому, что первая строка в сетке данных отображается как выделенная. Но, и не всегда ли один из них, эта строка не выбрана и не имеет фокуса. Я попытался установить IsSelected и Focus в этой строке, как показано ниже:

  SharedWindow.ShipmentWin.ShipVM.IsSelected = true;
  bool focused = SharedWindow.ShipmentWin.shipmentDataGrid.Focus();

Я все делаю неправильно, и есть ли другой способ выбрать первую строку в сетке данных и установить на нее фокус? Как правило, при создании сетки данных ни одна строка не выбирается до тех пор, пока пользователь не щелкнет мышью нужную строку.

Мы будем очень признательны за любые мысли.

Благодарность!


person Bill Campbell    schedule 09.03.2010    source источник


Ответы (2)


Взгляните на FocusManager. . Он позволяет установить фокус на другой элемент пользовательского интерфейса с помощью метода SetFocusedElement. Кроме того, он позволяет вам определить текущий элемент в вашем приложении, который находится в фокусе, что может пригодиться для отладки проблем с фокусом. Snoop также может быть полезен. Он показывает текущий сфокусированный элемент в нижней строке состояния.

Если вы используете DataGrid из набора инструментов WPF, будьте готовы найти некоторые ошибки, связанные с обработкой фокуса. Некоторые из них были рассмотрены недавно.

person olli-MSFT    schedule 09.03.2010
comment
Это было то, что я искал, но это было непросто понять, хотя вы указали мне правильное направление. Мне нужно было поместить код в метод onload, чтобы установить фокус, например: Keyboard.Focus(shipmentDataGrid); где shippingDataGrid является владельцем моих сочетаний клавиш. - person Bill Campbell; 11.03.2010

Также стоит понимать разницу между логическим фокусом и фокусом клавиатуры, которые являются совершенно разными животными. Метод .Focus() иногда устанавливает только логический фокус, а это, вероятно, не то, что вам нужно.

В документации для метода Focus указано что он вернет true, если был установлен фокус клавиатуры, и false в противном случае.

person Dan Puzey    schedule 09.03.2010
comment
Спасибо Дэн! Вы действительно правы, и это было то, что я не понял. Это фокус клавиатуры, который мне нужно было установить. - person Bill Campbell; 11.03.2010