2017-02-27 68 views
1

我试图创建一个触发器,它在VisibilityCollapsed时从选项卡导航中删除TextBlock当可见性被折叠时阻止切换到TextBlock

这是风格:

<Style x:Uid="Style_1" TargetType="TextBlock"> 
    <Setter x:Uid="Setter_1" Property="TextOptions.TextFormattingMode" Value="{StaticResource TextFormattingMode}"/> 
    <Setter x:Uid="Setter_32" Property="TextOptions.TextRenderingMode" Value="{StaticResource TextRenderingMode}"/> 
    <Setter x:Uid="Setter_2" Property="TextBlock.FontFamily" Value="{StaticResource FontFamily}"/> 
    <Setter x:Uid="Setter_3" Property="SnapsToDevicePixels" Value="True"/> 
    <Setter x:Uid="Setter_4" Property="VerticalAlignment" Value="Center"/> 
    <Setter x:Uid="Setter_74" Property="UseLayoutRounding" Value="True"/> 
    <Setter x:Uid="Setter_5" Property="Foreground" Value="{StaticResource LabelForeground}"/> 
    <Setter x:Uid="Setter_7" Property="FontSize" Value="{StaticResource FontSize}"/> 
    <Style.Triggers> 
     <DataTrigger x:Uid="DataTrigger_2" Binding="{Binding Source={x:Static cs:ZoomLevel.Instance}, Path=ActualZoomLevelIsDefault}" Value="False"> 
      <Setter x:Uid="Setter_33" Property="TextOptions.TextFormattingMode" Value="Ideal"/>      
     </DataTrigger> 
     <DataTrigger x:Uid="DataTrigger_100" Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Visibility}" Value="Collapsed"> 
      <!--<Setter Property="IsEnabled" Value="False"/>--> 
      <!--<Setter Property="Control.IsTabStop" Value="False"/>--> 
      <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/> 
      <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

但仍的TextBlock获得的焦点,如果我标签到它。当我将注意力集中到TextBlock时,IsKeyboardFocusWithin为true。我可以在我的触发器中将IsEnabled设置为false以使其工作,但我想知道为什么附加属性不起作用。所以我的问题是:为什么KeyboardNavigation属性不起作用?

例子:

<TextBlock x:Uid="TextBlock_2" Grid.Column="1" Grid.Row="1" Margin="3,3,0,0" HorizontalAlignment="Right" Visibility="Collapsed">   
     <Hyperlink x:Uid="Hyperlink_2" Command="{Binding SelectRoutingMethods}"> 
      <Run x:Uid="Run_2" Text="{Binding ContactPreferences}"/> 
     </Hyperlink> 
</TextBlock> 

TextBlock的是tabable但仍然在我的例子中可见。

+0

如何折叠的TextBlock获得焦点 – mm8

+0

?我也想知道为什么会发生这种情况...... – Sybren

+0

Collapse TextBlock is not visible,so not can happen。 – mm8

回答

1

这不是你的TextBlock重点。它是超链接。我不知道为什么,它甚至不在Visual Tree中,但它确实如此。这看起来像一个错误。如果您将其属性Focusable设置为false,则不再需要关注焦点。

这里完成简单的例子:

<Window.Resources> 
     <Style TargetType="TextBlock"> 
     <Setter Property="Focusable" Value="True" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Visibility}" Value="Collapsed"> 
      <Setter Property="Focusable" Value="False"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <TextBox>Temp</TextBox> 
    <TextBlock Visibility="Visible" Grid.Row="1"> 
     <Hyperlink Focusable="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=TextBlock}, Path=Focusable}" Command="{Binding AddOptionalAddressCommand}">test</Hyperlink> 
    </TextBlock> 
    <TextBox Grid.Row="2" >Temp</TextBox> 
    </Grid> 
0

如回答@Shadowed,这是Hyperlink所获得Focus。不知道为什么会发生这种情况,因为Content如果父母处于Collapsed状态,则不应获得Focus

无论如何,我可以给你解决这个问题。

<StackPanel> 
    <StackPanel.Resources> 
     <local:VisibilitytoFocusConverter x:Key="VisibilitytoFocusConv" /> 
    </StackPanel.Resources> 
    <TextBox >Temp</TextBox> 
    <TextBlock Visibility="Collapsed" Height="20" KeyboardNavigation.TabNavigation ="{Binding Visibility, RelativeSource={RelativeSource Self}, Converter={StaticResource VisibilitytoFocusConv}}"> 
     <Hyperlink Command="{Binding AddOptionalAddressCommand}" /> 
    </TextBlock> 
    <TextBox >Temp</TextBox> 
</StackPanel> 

转换器:

public class VisibilitytoFocusConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo language) 
    { 
     return ((Visibility)value) == Visibility.Visible ? "Local" : "None"; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo language) 
    { 
     return new NotFiniteNumberException(); 
    } 
} 

希望有所帮助。

0

致信@Shadowed用于查找超链接问题。

这里是我的可选择性的解决方案:设置HyperlinkKeyboardNavigation.IsTabStop基于下一个UIElement能见度达树(这将是TextBlock在这种特殊情况下

<Hyperlink x:Uid="Hyperlink_2" KeyboardNavigation.IsTabStop="{Binding IsVisible,RelativeSource={RelativeSource AncestorType={x:Type UIElement}}}">