在WPF中处理GUI上的选定对象

时间:2009-11-15 19:33:02

标签: c# wpf user-interface focus

我在WPF中构建了几个用户控件,它们都被添加到画布中。我想添加一个行为,以保持当前所选用户控件的轨道。在以下情况下应选择用户控件:

  1. 鼠标点击它;
  2. 当它收到焦点时;
  3. 当上述两个中的任何一个发生在usercontrol的子控件上时。
  4. 有没有办法纯粹通过使用WPF的焦点机制来处理这个问题,还是我需要在焦点类的帮助下自己解决这个问题?

    我已经阅读了在WPF中处理焦点的新方法,我面临的问题是键盘焦点决定当前所选对象是什么,但我的控件的某些部分无法接收键盘因此,即使点击这些部分,用户控制也不会获得焦点。

    我正在寻找有关如何实现此功能以及我能/应该依赖焦点机制的建议。毫无疑问,我不介意是否只能选择一个对象,但如果它可以轻松扩展到多选,那么我也不介意。

    只是为了澄清,我知道我可以通过处理大量事件并跟踪状态来手动构建它,但我只是希望有一种更简单的方法。

3 个答案:

答案 0 :(得分:1)

您可以使用UIElement.IsKeyboardFocusWithin属性,当UIElement或其中一个子节点具有键盘焦点时,该属性为true。它是一个依赖属性,因此您可以轻松地将其用于样式中的触发器

答案 1 :(得分:1)

当任何一个孩子使用FocusManager.IsFocusScope="True"获得键盘焦点时,您可以将逻辑焦点设置为控件。将键盘焦点设置为控件或尝试执行操作将占用子控件的键。

如果任何一个孩子有焦点,你可以使用UIElement.IsKeyboardFocusWithin来设置控件的焦点。

你可以阅读这篇文章,我认为很好地描述了Logical和Keyboard焦点之间的区别:

http://www.pluralsight.com/community/blogs/eburke/archive/2009/03/18/why-is-focus-in-wpf-so-tricky-managing-and-understanding-focus-in-a-wpf-application.aspx

答案 2 :(得分:1)

UIElement.IsKeyboardFocusWithinPreviewMouseDown处理程序结合使用:

  1. 调用PreviewMouseDown时,设置一个标志并使用Dispatcher.BeginInvoke的{​​{1}}来安排回调,以便在标志仍然设置的情况下将焦点设置为UserControl。

  2. 在UserControl中为DispatcherPriority.Input属性更改设置处理程序。处理程序触发时,清除标记。

  3. 这里的想法是,如果您单击UserControl上的任何位置并且键盘焦点不会导致焦点移动到UserControl中,请将其强制进入UserControl。

    仅供参考,这里的第1步似乎是代码:

    UIElement.IsKeyboardFocusWithin