复合控件中的WPF TabIndex

时间:2009-12-11 09:36:34

标签: wpf composite-controls tabindex

我有一个简单的窗口,里面嵌入了一个简单的复合控件。

(主窗口)

<Window x:Class="TabOrder.Window1"
xmlns:local="clr-namespace:TabOrder"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Label HorizontalAlignment="Left" VerticalAlignment="Top">First</Label>
    <TextBox TabIndex="0" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="80,0,0,0"/>

    <Label HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,30,0,0">Second</Label>
    <TextBox TabIndex="1" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="80,30,0,0"/>

    <local:MyControl Margin="0,60,0,0" VerticalAlignment="Top" HorizontalAlignment="Stretch" TabIndex="2"/>
</Grid>

(复合控制)

<UserControl x:Class="TabOrder.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
    <Label HorizontalAlignment="Left" VerticalAlignment="Top">Third</Label>
    <TextBox HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="80,0,0,0"/>

    <Label HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,30,0,0">Fourth</Label>
    <TextBox HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="80,30,0,0"/>
</Grid>

正如我预期的那样,我会收到4个文本框......

  • 第一
  • 第二
  • 第三

但是当“First”有焦点并且我点击tab时,焦点会切换到“Third”。 WPF似乎将选项卡列表视为单个平面列表而不是MyControl为TabIndex 3的树,而文本框“Third”是其中的第一个选项卡控件。

这是WPF中的错误还是有其他方法可以做到这一点?复合控件在许多窗口中使用,甚至可以在一个窗口中多次使用。

1 个答案:

答案 0 :(得分:12)

我知道这个回复已经很晚了......但你试过了吗?

<UserControl ... KeyboardNavigation.TabNavigation="Local">

这样做将确保一旦您的UserControl已经收到焦点,您将只在UserControl中通过TabStop导航(而不是担心整个应用程序中的TabIndex值冲突)。循环浏览UserControl的TabStop后,TabNavigation将恢复到其外部的TabStop。

http://msdn.microsoft.com/en-us/library/system.windows.input.keyboardnavigationmode.aspx