假设下面有 aTextBox
和 aButton
之类的,一切都很好。您可以使用制表位在两个控件之间来回切换。
<StackPanel>
<TextBox>Type Here</TextBox>
<Button>Click Me</Button>
</StackPanel>
但是,如果您重新定义TextBox
布局,则不能使用制表位导航到按钮。
<Style TargetType="TextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<ScrollViewer x:Name="PART_ContentHost" />
<Button>Template-Button</Button>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
也就是说,您仍然可以在文本区域和“单击我”按钮(它仍然是一个单独的控件)之间来回导航,但您不会到达“模板按钮”(它是 的一部分TextBox
):
Windows 7 Basic 样式不会出现此问题。
似乎这对于模板是正确的TextBox
,但对任何控件都不一定。模板化时,Button
您可以到达控件的任何部分。在以下示例中,您可以访问ComboBox
以及TextBox
。
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<ComboBox>ComboBox</ComboBox>
<TextBox>TextBox</TextBox>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ControlTemplate
我想知道为什么会这样,除了不使用和“滥用”另一个控件(如)之外是否还有其他解决方法,Button
因为我失去了TextBox
-features 并且必须重新实现它们。
不幸的是,我在互联网上搜索时没有找到任何东西。我发现一些消息来源指出 Windows 经典模板的实现方式与相应的 Aero 模板不同(例如填充问题),但我不确定这是否也适用于制表位(尽管有一个属性IsTabStop
- 至少,我是'无法通过将此属性显式设置为True
) 来解决此问题。
那么,有什么我能做的吗?
一些附加说明:
对于 PasswordBox 来说更糟糕的是,您无法同时访问 Windows 7 经典主题和基本主题的任何模板元素。
此问题在 Windows 7 系统上可重现,但 AFAIK 它也出现在 Windows 8 上。