我有下一个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
时,我们会在MyControl1
和MyControl12
下。
显示MyControl22
时,它位于MyControl1
,MyControl12
和MyControl21
下。
我希望当我在MyControl22
上使用Tab时,只有MyControl22
子控件可供选择。但看起来像制表会从MyControl21
,MyControl1
和MyControl12
中选择较低级别的控件。
如何防止较低级别的标签选择控件?
答案 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>
其中TabNavConverter
是IValueConverter
,如果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)可能会有所帮助,这样就不会如果添加更多控件,则必须更改触发器规则。