确定 WPF 窗口中具有焦点的对象

7

我们正在使用WPF,并从DockingLibrary继承了一个窗口。该窗口具有一个包含多个项目的网格,其中一个是WPF数据网格。我们使用M-V-VM模式。当创建并显示此窗口时,该数据网格中的所有行都未被选中。我们可以通过执行以下操作将行设置为高亮显示:

  SharedWindow.ShipmentWin.shipmentDataGrid.SelectedIndex = 0;

这会导致datagrid中的第一行被突出显示。但是,总是有一个问题,这一行既没有被选中,也没有焦点。我尝试设置该行的IsSelected和Focus:

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

我是不是在做这个事情时出了些问题,有没有其他方法可以选择数据表格中的第一行并将焦点设置到它上面?通常,在创建数据表格时,直到用户点击所需的行之前,都不会选择任何行。

非常感谢您的想法!

谢谢!

2个回答

10
请查看FocusManager,它允许你通过SetFocusedElement方法将焦点设置到另一个UI元素上。此外,它还允许你确定应用程序中当前聚焦的元素,这可以方便地帮助你调试焦点问题。同时,Snoop也是非常有用的。它会在底部状态栏中显示当前聚焦的元素。
如果你使用WPF Toolkit中的DataGrid,请准备好发现与焦点处理相关的一些错误。其中一些最近已被解决 recently

这正是我一直在寻找的,但即使你指引了我正确的方向,弄清楚它也并不简单。我需要在onload方法中放置代码来设置焦点,例如: Keyboard.Focus(shipmentDataGrid); 其中shipmentDataGrid是我的键盘快捷键的所有者。 - Bill Campbell

1

值得注意的是,理解逻辑焦点和键盘焦点之间的区别非常重要,它们是完全不同的概念。有时候.Focus()方法只会设置逻辑焦点,这可能不是你想要的。

Focus方法的文档告诉你,如果键盘焦点被设置,则返回true,否则返回false


谢谢Dan!你说得没错,这是我没有意识到的问题。我需要设置键盘焦点。 - Bill Campbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接