【发布时间】:2012-05-14 02:52:52
【问题描述】:
我如何在代码中定义容器或焦点子项的逻辑焦点,没有为其提供键盘焦点?
我只想控制当控件将通过 Tab 键获得焦点或单击没有击中子项的容器部分时,哪个子项将获得焦点,但如果没有,则不给它(或窃取)实际焦点'还没有。
而且我还希望通过键盘手势选择特定的孩子或用鼠标单击它仍然是可能的。
我了解 WPF 中键盘焦点和逻辑焦点之间的区别,对于一个元素,拥有键盘焦点也意味着拥有逻辑焦点,但拥有逻辑焦点并不意味着元素拥有键盘焦点。
我还了解附加属性 FocusManager.FocusedElement 定义了从定义此属性的元素开始在可视树中哪个元素具有逻辑焦点。
我意识到这个属性不仅在 FocusManager.IsFocusScope 设置为 true 时使用,还用于 GroupBox 等容器。
我在 WPF 焦点主题上进行了很多尝试、大量搜索和阅读,但到目前为止都没有成功,我不明白我缺少什么:
FocusManager.SetFocusedElement也给键盘焦点,我之前暂时将我的子元素的属性Focusable更改为false,它只在之前没有孩子有焦点的第一次工作,但在孩子获得焦点后不起作用
一个例子来说明我想要实现的目标:我有一个简单的 RadioButtons 组,我想在代码中动态控制当用户“tab”将焦点移到这个 GroupBox 时哪个选项将获得焦点(通常是具有isChecked=true 的选项)。
<GroupBox Header="Options" Name="myGroupBox"
KeyboardNavigation.TabNavigation="Once"
KeyboardNavigation. DirectionalNavigation="Cycle" >
<StackPanel>
<RadioButton GroupName="g1" Name="opt1" Content="Option _1"/>
<RadioButton GroupName="g1" Name="opt2" Content="Option _2"/>
<RadioButton GroupName="g1" Name="opt3" Content="Option _3"/>
</StackPanel>
</GroupBox>
最后的评论,我知道如何使用 ListBox 实现选项的动态列表,将列表的 selectedItem 绑定到数据上下文的属性,然后通过 ListBoxItem 上的样式和模板将项目模板中 RadioButton 的 IsChecked 属性绑定到其父级的 IsSelected 属性ListBoxItem,它可以工作,但对于我的具体情况,我需要将我的 RadioButtons 直接绑定到我的数据上下文的属性,我不能将它们绑定到 IsSelected 属性同时列表。
【问题讨论】:
-
尝试为 GroupBox 设置 FocusManager.IsFocusScope = true
-
好问题,我自己也在寻找这个答案……
标签: wpf xaml focus focusmanager