阻止较低z-index控件的选项卡导航

时间:2016-10-27 13:39:25

标签: wpf xaml

我有下一个xaml:

<Grid>
  <local:MyControl1 Grid.Row="0" Panel.Z-Index="1" />
  <local:MyControl12 Grid.Row="1" Panel.Z-Index="1" />
  <local:MyControl21 Grid.Row="0" Grid.RowSpan="2" Panel.ZIndex="2" />
  <local:MyControl22 Grid.Row="0" Grid.RowSpan="2" Panel.ZIndex="3" />
</Grid>

显示MyControl21时,我们会在MyControl1MyControl12下。 显示MyControl22时,它位于MyControl1MyControl12MyControl21下。

我希望当我在MyControl22上使用Tab时,只有MyControl22子控件可供选择。但看起来像制表会从MyControl21MyControl1MyControl12中选择较低级别的控件。

如何防止较低级别的标签选择控件?

2 个答案:

答案 0 :(得分:0)

您可以使用附加属性KeyboardNavigation.TabNavigation

让我们看一个样本:

<Grid>
    <local:UserControl1 x:Name="uc1" Panel.ZIndex="1" 
                        KeyboardNavigation.TabNavigation="{Binding ElementName=uc2, Path=Visibility, Converter={StaticResource TabNavConverter}}" />
    <local:UserControl2 x:Name="uc2" Panel.ZIndex="2" />
</Grid>

其中TabNavConverterIValueConverter,如果uc2折叠则返回Continue,如果可见,则返回None

我希望它可以提供帮助。

答案 1 :(得分:0)

这里没有很多很棒的选择。据我所知,KeyboardNavigation中没有设置根据ZIndex自动跳过控件。因此,很难找到一个自动适用于ZIndex值的所有不同组合的解决方案(自动确定顶部控件)。我认为最好的办法是根据样式触发器修改IsTabStop属性。

<Style TargetType="Control" x:Key="TabStopStyle">
   <Style.Triggers>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(Panel.ZIndex)}" Value="3">
         <Setter Property="KeyboardNavigation.IsTabStop" Value="True"/>
      </DataTrigger>
   </Style.Triggers>
   <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
</Style>

不幸的是,由于您的控件属于所有不同类型,因此您必须明确设置每个控件的样式:

  <local:MyControl22 Grid.Row="0" Grid.RowSpan="2" Panel.ZIndex="3" Style="{StaticResource TabStopStyle}"/>

此示例假定顶部控件的ZIndex为3.为了概括这一点,将顶部控件设置为更高ZIndex(如100)可能会有所帮助,这样就不会如果添加更多控件,则必须更改触发器规则。