WPF 复合控件焦点设置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 复合控件焦点设置相关的知识,希望对你有一定的参考价值。
参考技术A 定义一个密码框的复合控件,最外层是 Border, 内部有三个控件分别是 Image, GridSplitter, PasswordBox.当键盘输入完账号通过 tab 键跳转到密码框,会发现焦点不在 PasswordBox 上而是跑到了 GridSplitter 上,并有虚框。那为什么 Image 没有获取到焦点呢?
查询 MSDN 资料发现有一个依赖项属性 Focusable, 设置它为 true 代表此控件允许获取焦点,false 代表此控件不允许获取焦点。而 Image 控件默认是 false, 因此在 XMAL 文件中将 GridSplitter 的 Focusable 属性设置为 false 就好了。
<GridSplitter Focusable = "False" />
WPF设置控件获得焦点FocusManager
简单用法如下:
在父类容器中通过附加属性FocusManager.FocusedElement来绑定需要强制获得焦点的控件,用法如下:
<Grid FocusManager.FocusedElement="{Binding ElementName=btn}">
<Button x:Name="btn" Content="1234"/>
</Grid>
需要注意的是:当控件使用Style或者Template重写了控件的结构时,这样设置可能会无效,此时需要进入到Template中去设置
可以查看例子:
1 <Window x:Class="FocusManagerDemo.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow" Height="350" Width="525"> 5 <Grid> 6 <!--需要测试外层Button时,可以去掉注释,同时注意,同一时刻内只有一个控件能获得焦点<Grid FocusManager.FocusedElement="{Binding ElementName=btn}">--> 7 <Button x:Name="btn" Content="1234"/> 8 <Grid> 9 <TextBox x:Name="txt" Text="abc" Margin="106,73,97,145"> 10 <TextBox.Style> 11 <Style TargetType="TextBox"> 12 <Setter Property="Template"> 13 <Setter.Value> 14 <ControlTemplate TargetType="TextBox"> 15 <Grid FocusManager.FocusedElement="{Binding ElementName=btn123}"> 16 <Button x:Name="btn123" Content="123" Margin="10"/> 17 </Grid> 18 </ControlTemplate> 19 </Setter.Value> 20 </Setter> 21 </Style> 22 </TextBox.Style> 23 </TextBox> 24 </Grid> 25 </Grid> 26 </Window>
以上是关于WPF 复合控件焦点设置的主要内容,如果未能解决你的问题,请参考以下文章