我正在开发一个从 Control 派生并使用 ControlTemplate 定义的自定义控件。去掉所有的花里胡哨后,控件只显示四个文本框:
<Style TargetType="{x:Type local:MyControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyControl}">
<StackPanel Orientation="Horizontal">
<TextBox/>
<TextBox/>
<TextBox/>
<TextBox/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题是控件能够接收键盘焦点并在其自身周围绘制焦点矩形(不是文本框之一,而是围绕所有文本框)。当浏览窗口中的控件时,这会添加一个不必要的制表位。
在自定义控件上将 Focusible 设置为 false(使用样式中的 setter)可以解决问题,但这样的解决方案远非完美,因为使用该控件的开发人员可以将 Focusible 设置为 true,这会破坏制表位行为。
我可以响应控件的 GotKeyboardFocus 事件并在整个控件获得焦点时将焦点分配给第一个 TextBox,但是在返回时(使用 Shift+Tab)这将无法正常工作,第一个 TextBox 将获得焦点,而在这种情况下最后一个 TextBox 应该首先关注。
如何防止整个自定义控件接受键盘焦点,但允许子 TextBoxes 正常充当制表位?