2011-03-28 21 views
7

Problema: La navegación con la tecla TAB se detiene al colapsarse TextBlock/Hyperlink.WPF: Navegación con pestañas rota con hipervínculo colapsado

Reproducción:

<Window x:Class="TabTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Width="200" Height="200"> 

    <Grid> 
     <StackPanel Orientation="Vertical"> 
      <TextBox Text="before" /> 
      <TextBlock> 
       <TextBlock.Style> 
        <Style TargetType="{x:Type TextBlock}"> 
         <Setter Property="Visibility" Value="Collapsed"/> 
        </Style> 
       </TextBlock.Style> 
       <Hyperlink Focusable="False"> 
        <TextBlock Text="test" /> 
       </Hyperlink> 
      </TextBlock> 
      <TextBox Text="after" /> 
     </StackPanel> 
    </Grid> 
</Window> 

Si ejecuta esta demo y pulse TAB súper simple, el cursor se desplaza al "antes" cuadro de texto. Presionar TAB nuevamente no ... nada. El cursor permanece en el cuadro de texto "anterior" y nunca llega al cuadro de texto "después". La navegación funciona como se espera cuando el TextBlock del hipervínculo está visible.

Pregunta: ¿Cómo hago que la navegación TAB funcione correctamente con el HyperLink colapsado?

Respuesta

8

El problema no es el hipervínculo sino los controles anidados dentro del bloque de texto. Puede cambiarlo a

<TextBlock Visibility="Collapsed">    
    <TextBlock Text="MyText" /> 
</TextBlock> 

y la navegación con pestañas aún estaría rota.

La solución es utilizar KeyboardNavigation.TabNavigation="Once" en el TextBlock exterior:

<TextBlock KeyboardNavigation.TabNavigation="Once"> 
    <TextBlock.Style> 
     <Style TargetType="{x:Type TextBlock}"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </Style> 
    </TextBlock.Style> 
    <Hyperlink Focusable="False"> 
     <TextBlock Text="test" /> 
    </Hyperlink> 
</TextBlock> 

entonces todo funciona de la manera como se pretende. El problema es que el TextBlock interno obtiene el foco, incluso si el control externo está colapsado. El ajuste KeyboardNavigation.TabNavigation a Once lo resuelve, ya que todo el Contenedor y sus hijos obtienen el foco una sola vez. (MSDN)

+0

simple pero eficaz ;-) Gracias! –

2

@ respuesta de Gimno me puso en el camino correcto, pero he encontrado que el uso de KeyboardNavigation.TabNavigation="None" en realidad le da el foco elemento superior sólo una vez (como era de esperar de Once). La respuesta de Gimno funciona porque también estableció Focusable="False" en el hipervínculo. Con TabNav = None, no tiene que configurar Focusable en todos los controles de los niños.

Aquí está mi aplicación de este método (sólo el botón se pone pestaña enfoque, tampoco bloque de texto o hipervínculo):

<Button Command="{Binding ChangeSoundCommand}" Click="ChangeSoundClick" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Padding="0" 
KeyboardNavigation.TabNavigation="None"> 
    <Button.Template> 
     <ControlTemplate> 
      <Grid> 
       <TextBlock Name="tb" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed" > 
        <Hyperlink>Browse...</Hyperlink> 
       </TextBlock> 
       <TextBlock Name="w_content" Text="{Binding FilePath}" TextTrimming="CharacterEllipsis" /> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger SourceName="w_content" Property="Text" Value=""> 
        <Setter TargetName="tb" Property="Visibility" Value="Visible"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 
Cuestiones relacionadas