2011-03-28 11 views
7

Sorun: TAB tuşu ile Navigasyon çökmüş TextBlock/Hyperlink durur.WPF: Daraltılmış köprü ile kırık Tab navigasyon

Üreme: Bu son derece basit bir demo ve TAB tuşuna çalıştırırsanız

<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> 

, imleç "önce" TextBox hareket eder. SEKME'ye tekrar basmak ... hiçbir şey yapmaz. İmleç "Önce" TextBox kalır ve asla ulaşır metin kutusu "sonra". Gezinme, Köprü Metni Metni görünür olduğunda beklendiği gibi çalışır.

Soru: Daraltılmış HyperLink ile SEKME gezinme işini nasıl düzgün yapabilirim?

cevap

8

sorun Köprü ama TextBlock içinde yuvalanmış denetimleri değildir. Bunu

olarak değiştirebilir ve Sekme gezinme hala bozulabilir.

çözüm dış TextBlock de KeyboardNavigation.TabNavigation="Once" kullanmaktır:

<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> 

sonra her şey istendiği gibi şekilde çalışır. Sorun iç TextBlock Daraltıldığında bile dış denetim ise, Odak alır olmasıdır. Once için KeyboardNavigation.TabNavigation Ayar bütün Konteyner olarak çözer ve oğul sadece bir kez odağı olsun. Gimno cevabı doğru yolda beni koy, ama (sen Once beklediğiniz gibi) ben KeyboardNavigation.TabNavigation="None" kullanarak aslında sadece bir kez üst eleman odağı verdiğini bulduk @ (MSDN)

+0

Basit ama etkili ;-) teşekkür ederiz! –

2

. o/o da köprü üzerinde Focusable="False" set çünkü Gimno cevabı çalışır. TabNav = Yok ile, tüm çocuk denetimlerine Odaklanabilir'i ayarlamanız gerekmez.

İşte (sadece Düğme sekmesi odak değil, ya textblock veya köprü alır) Bu yöntemin başvurum var:

<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> 
İlgili konular