C# 使用自定义文本框控件模板管理键盘焦点

C# 使用自定义文本框控件模板管理键盘焦点,c#,wpf,xaml,C#,Wpf,Xaml,目前我正在从事一个WPF项目,该项目为TextBox定义了自定义样式。除其他外,我们覆盖了文本框的默认控件模板。控件模板如下所示(我删除了很多TemplateBinding内容,因为它们不相关) 本质上,这只是添加了一个ContentPresenter来显示一个组合框,允许用户选择用于显示或输入文本框的不同单位。模板选择器只是在用户控件(实际上只是一个组合框)或空模板(如果文本框没有任何关联的单元数据)(内容为null)之间进行选择 问题 由于此组合框本质上是文本框控件模板的一部分,因此与组

目前我正在从事一个WPF项目,该项目为
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>