目前,我正在开发一个为TextBox
定义自定义样式的WPF项目。除此之外,我们覆盖TextBox
的默认控件模板。控件模板看起来像这样(我删除了很多TemplateBinding
内容,因为它不相关)。
<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>
基本上这只是添加ContentPresenter
来显示一个组合框,允许用户选择用于显示或输入文本框的不同单位。如果文本框没有任何关联的单位数据(内容为ComboBox
),模板选择器只需在用户控件(实际上只是null
)或空模板之间进行选择。
由于此组合框基本上是文本框控件模板的一部分,因此与组合框交互会使键盘焦点到文本框,而不会将插入符实际放入可视文本框中。在其他地方,我们有一个键盘控件,当文本框获得键盘焦点时,键盘控件最终可见(键盘本身实际上是在监听自定义路由事件,但最终会在TextBox
获得焦点时引发这些事件。
有什么方法可以阻止文本框在实际文本输入以外的任何内容得到焦点时获得焦点吗?我希望的行为是操纵组合框并不会导致屏幕键盘弹出。
我的直觉告诉我,由于所有焦点逻辑都发生在TextBox
级别并且它并不真正关心内容,因此我无法实际执行我想要的操作。控制模板。但我只是好奇是否有人能够想到某种解决方法。
我希望避免引入自定义文本框控件来处理这个问题,因为我们不太喜欢特定于应用程序的自定义控件(特别是考虑到我们已经使用了多少目前的一个)。