1

假设下面有 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 上。

4

2 回答 2

2

我在另一个问题Tab stop not working for textboxes inside data template上找到了我的问题的答案。

我一开始没有找到它,因为我将搜索重点放在了 Windows 7 经典风格上。

因此,解决此问题所需要做的就是在我的样式中添加一个设置器,将KeyboardNavigation.TabNavigation值设置为Continue.

<Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" />

由于这个值,每个元素都会获得键盘焦点:

继续:每个元素都接收键盘焦点,只要它是导航停止。到达边缘时,导航会离开包含元素。

根据MSDN,默认值是Continue,但对于默认值实际为 的经典主题,情况并非如此None。不幸的是,任何地方都没有提示。

于 2013-09-13T10:52:02.263 回答
0

您是否尝试过将Control.IsTabStop属性设置为TextBoxto True?请查看MSDN上的Control.IsTabStop 属性页面以获取更多信息。

<TextBox IsTabStop="True" ... />
于 2013-09-12T09:28:44.627 回答