Определите, кто имеет фокус в окне WPF - PullRequest
6 голосов
/ 09 марта 2010

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

  SharedWindow.ShipmentWin.shipmentDataGrid.SelectedIndex = 0;

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

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

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

Любые мысли будут с благодарностью.

спасибо!

Ответы [ 2 ]

9 голосов
/ 09 марта 2010

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

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

0 голосов
/ 09 марта 2010

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

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

...