C# 使用自定义文本框控件模板管理键盘焦点
目前我正在从事一个WPF项目,该项目为C# 使用自定义文本框控件模板管理键盘焦点,c#,wpf,xaml,C#,Wpf,Xaml,目前我正在从事一个WPF项目,该项目为TextBox定义了自定义样式。除其他外,我们覆盖了文本框的默认控件模板。控件模板如下所示(我删除了很多TemplateBinding内容,因为它们不相关) 本质上,这只是添加了一个ContentPresenter来显示一个组合框,允许用户选择用于显示或输入文本框的不同单位。模板选择器只是在用户控件(实际上只是一个组合框)或空模板(如果文本框没有任何关联的单元数据)(内容为null)之间进行选择 问题 由于此组合框本质上是文本框控件模板的一部分,因此与组
TextBox
定义了自定义样式。除其他外,我们覆盖了文本框
的默认控件模板。控件模板如下所示(我删除了很多TemplateBinding
内容,因为它们不相关)
本质上,这只是添加了一个ContentPresenter
来显示一个组合框,允许用户选择用于显示或输入文本框的不同单位。模板选择器只是在用户控件(实际上只是一个组合框
)或空模板(如果文本框没有任何关联的单元数据)(内容为null
)之间进行选择
问题
由于此组合框本质上是文本框控件模板的一部分,因此与组合框交互可使文本框获得键盘焦点,而无需实际将插入符号放入可视文本框中。在其他地方,我们有一个键盘控件,当文本框获得键盘焦点时,该控件最终可见(键盘本身实际上正在侦听自定义路由事件,但当TextBox
获得焦点时,这些事件最终会被触发)
问题
当实际文本输入以外的任何内容从技术上获得焦点时,有什么方法可以防止文本框获得焦点?我想要的行为是操纵组合框不会导致屏幕上的键盘弹出
我的直觉告诉我,我不能真正做我想做的事情,因为所有的焦点逻辑都发生在TextBox
级别,而且它并不真正关心控件模板的内容。但我只是好奇是否有人能想出某种解决方法
我不想引入自定义文本框控件来处理这个问题,因为我们不太喜欢特定于应用程序的自定义控件(特别是考虑到我们在当前控件上已经取得了多大进展)。您是否尝试过在“实际文本输入”上使用
FocusManager.IsFocusScope=“True”
,在父控件上使用Focusable=false
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="PART_ContentHost"
IsTabStop="False"
Background="{x:Null}"
VerticalAlignment="Center"
BorderThickness="0"/>
<ContentPresenter Grid.Column="1" Margin="5,0,0,0" Focusable="False"
Content="{TemplateBinding local:UnitConversion.Info}"
ContentTemplateSelector="{DynamicResource SelectorKey}"/>
</Grid>
</Border>