我在WPF中构建了几个用户控件,它们都被添加到画布中。我想添加一个行为,以保持当前所选用户控件的轨道。在以下情况下应选择用户控件:
有没有办法纯粹通过使用WPF的焦点机制来处理这个问题,还是我需要在焦点类的帮助下自己解决这个问题?
我已经阅读了在WPF中处理焦点的新方法,我面临的问题是键盘焦点决定当前所选对象是什么,但我的控件的某些部分无法接收键盘因此,即使点击这些部分,用户控制也不会获得焦点。
我正在寻找有关如何实现此功能以及我能/应该依赖焦点机制的建议。毫无疑问,我不介意是否只能选择一个对象,但如果它可以轻松扩展到多选,那么我也不介意。
只是为了澄清,我知道我可以通过处理大量事件并跟踪状态来手动构建它,但我只是希望有一种更简单的方法。
答案 0 :(得分:1)
您可以使用UIElement.IsKeyboardFocusWithin
属性,当UIElement或其中一个子节点具有键盘焦点时,该属性为true。它是一个依赖属性,因此您可以轻松地将其用于样式中的触发器
答案 1 :(得分:1)
当任何一个孩子使用FocusManager.IsFocusScope="True"
获得键盘焦点时,您可以将逻辑焦点设置为控件。将键盘焦点设置为控件或尝试执行操作将占用子控件的键。
如果任何一个孩子有焦点,你可以使用UIElement.IsKeyboardFocusWithin
来设置控件的焦点。
你可以阅读这篇文章,我认为很好地描述了Logical和Keyboard焦点之间的区别:
答案 2 :(得分:1)
将UIElement.IsKeyboardFocusWithin
与PreviewMouseDown
处理程序结合使用:
调用PreviewMouseDown
时,设置一个标志并使用Dispatcher.BeginInvoke
的{{1}}来安排回调,以便在标志仍然设置的情况下将焦点设置为UserControl。
在UserControl中为DispatcherPriority.Input
属性更改设置处理程序。处理程序触发时,清除标记。
这里的想法是,如果您单击UserControl上的任何位置并且键盘焦点不会导致焦点移动到UserControl中,请将其强制进入UserControl。
仅供参考,这里的第1步似乎是代码:
UIElement.IsKeyboardFocusWithin