2010-12-05 83 views
1

在我的WPF 4.0基於桌面的應用程序中,我想通過按Tab鍵添加遍歷窗口元素的能力。WPF中窗口元素的TabNavigation

這裏是我的XAML片段:

<!--main body layout--> 
<StackPanel x:Name="BodyLayout" 
     Style="{StaticResource Body_Block}"> 

    <!--teaser block--> 
    <Grid x:Name="TeaserGrid"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <TextBlock Grid.Column="0" 
       Grid.Row="0" 
       Style="{StaticResource Body_Teaser_Centering}"> 
       <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}" 
         Focusable="True" 
         KeyboardNavigation.TabIndex="0" 
         Click="Call_WinOffences_Click"> 
        <Image Source="Resources/teaser_offences.png" 
          Style="{StaticResource Body_Teaser_Image}" /> 
        <LineBreak /> 
        <TextBlock Text="Offences" 
          Style="{StaticResource Body_Title}" /> 
       </Hyperlink> 
     </TextBlock> 

     <TextBlock Grid.Column="1" 
       Grid.Row="0" 
       Style="{StaticResource Body_Teaser_Centering}"> 
      <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}" 
        Focusable="True" 
        KeyboardNavigation.TabIndex="1" 
        Click="Call_WinEvents_Click"> 
       <Image Source="Resources/teaser_events.png" 
         Style="{StaticResource Body_Teaser_Image}" /> 
       <LineBreak /> 
       <TextBlock Text="Events" 
         Style="{StaticResource Body_Title}" /> 
      </Hyperlink> 
     </TextBlock> 
    </Grid> 
</StackPanel> 

正是我需要什麼? 我想要打開這個窗口,並通過第一次在Tab鍵盤上按下,使用TabIndex =「0」將焦點設置在超鏈接塊(帶有圖像和TextBlock)上,並且通過第二個Tab按鈕以用TabIndex =「1」切換焦點在元素上,我也想循環這些開關。換句話說,我希望該用戶可以通過Tab鍵盤瀏覽窗口中的元素,因爲我們經常在其他普通的WinForms應用程序中執行此操作。

現在我真的有什麼? 當我在Tab鍵上按下時超鏈接不能獲得焦點,我不能在沒有鼠標的情況下使用我的窗口。

請讓我知道我要出錯了嗎?

回答

1

更新
我複製你的示例代碼(除了我沒有樣式)轉換成一個小項目,這似乎是爲我工作的罰款。我可以啓動窗口,按Tab鍵先聚焦超鏈接,按下Enter鍵,然後點擊事件,再次按Tab鍵等等。我能想到的唯一的事情就是樣式中的某些內容會覆蓋這種行爲。我上傳了我的示例項目here

注:我改變了源的圖像,所以你必須要改回:)

舊後
這裏有兩個部分。第一個是如果FrameworkElement是可聚焦或不可聚焦的。第二個是TabIndex。 TabIndex在Control中,它派生自FrameworkElement,並非所有元素都從Control派生,如TextBlock,Rectangle等。如果由於某種原因想要將TabIndex添加到這些元素,那麼您可以使用KeyboardNavigation.TabIndex代替。這裏有一個簡單的例子,帶有Tab-Order集的6個控件,1個Rectangle不可聚焦(因爲默認情況下它不是可聚焦的)。

<Grid ShowGridLines="True"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Button Grid.Row="0" Grid.Column="0" 
      Content="Some Button" 
      KeyboardNavigation.TabIndex="0" 
      Margin="5"/> 
    <TextBox Grid.Row="1" Grid.Column="0" 
      Text="Some TextBox" 
      KeyboardNavigation.TabIndex="2" 
      Margin="5"/> 
    <TextBox Grid.Row="2" Grid.Column="0" 
      Text="Another TextBox" 
      KeyboardNavigation.TabIndex="1" 
      Margin="5"/> 
    <TextBlock Grid.Row="0" Grid.Column="1" 
       Text="Focusable TextBlock" 
       Focusable="True" 
       KeyboardNavigation.TabIndex="4" 
       Margin="5"/> 
    <Rectangle Grid.Row="1" Grid.Column="1" 
       Fill="Blue" 
       Margin="5"/> 
    <Rectangle Grid.Row="2" Grid.Column="1" 
       Fill="Red" 
       Focusable="True" 
       KeyboardNavigation.TabIndex="3" 
       Margin="5"/> 
</Grid> 
+0

我將KeyboardNavigation.TabIndex添加到某些超鏈接對象,但它不起作用,我沒有在超鏈接上看到焦點邊框。我該如何解決它?我所有的超鏈接都位於Grid元素的內部。 – 2010-12-07 12:41:34

0

也許這將幫助:WPF TabStop/TabIndex in ItemsControl

TabIndex的是你去這裏的路。當你點擊標籤瀏覽控件時,它將按照TabIndex的順序進行。這些甚至不需要按順序排列 - 如果在任何地方沒有定義3和4,則1,2,5與1,2和3相同。