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>
View Code

 

以上是关于WPF 复合控件焦点设置的主要内容,如果未能解决你的问题,请参考以下文章

WPF设置控件获取键盘焦点时的样式FocusVisualStyle

WPF:无法设置焦点

将焦点放在 WPF ComboBox 上并不总是有效

WPF 打开新窗口 如何设置 焦点还在原来的窗口 谢谢

将焦点设置在 xaml wpf 中的文本框上

从视图模型中将焦点设置在 WPF 中的 TextBox 上