2016-10-29 6 views
5

私はWindowをいくつも持っています。それらの1つはDataGridです。デフォルト以外のフォーカストラバーサルを実装したいと思います。すなわち:矢印キーの行選択を使用して、フォーカストラバーサルでDataGrid全体を1つのストップにする方法はありますか?

  • DataGridは、それぞれの行ではなく、全体として単一のストップです。
  • DataGridにフォーカスがあると、ユーザーは上下のキーを使用して行をナビゲートできます。
  • 左キーと右キーを使用して列を移動することはできません。
  • 最初の列(およびナビゲーションにのみ関連します)は、タイプがDataGridHyperlinkColumnです。ユーザーがSpaceキーまたはEnterキーを押すと、ハイパーリンクが実行されます。

    <DataGrid x:Name="DocumentTemplatesGrid" 
          Grid.Row="2" 
          ItemsSource="{Binding Source={StaticResource DocumentTemplatesView}}" 
          IsReadOnly="True" 
          AutoGenerateColumns="False" 
          SelectionUnit="FullRow" 
          SelectionMode="Single" 
          TabIndex="1" 
          IsTabStop="True"> 
        <DataGrid.CellStyle> 
        <Style TargetType="DataGridCell"> 
         <Setter Property="IsTabStop" Value="False"/> 
        </Style> 
        </DataGrid.CellStyle> 
        <DataGrid.RowStyle> 
        <Style TargetType="DataGridRow"> 
         <Setter Property="IsTabStop" Value="False"/> 
        </Style> 
        </DataGrid.RowStyle> 
        <DataGrid.Columns> 
        <DataGridHyperlinkColumn Header="Name" 
              Width="2*" 
              Binding="{Binding Name}"/> 
        <DataGridTextColumn Header="Description" 
             Width="5*" 
             Binding="{Binding Description}"/> 
        <DataGridTextColumn Header="Type" 
             Width="*" 
             Binding="{Binding Type}"/> 
        </DataGrid.Columns> 
    </DataGrid> 
    

    残念ながら、それは私の期待に達しない:私は、次のコードを持っている瞬間

。 これを達成する方法を教えてください。

+0

4つの機能のうち、援助が必要なものはどれですか?コードを試したときにTabStops(1)とUp-Down navigation(2)が正常に機能しました – ASh

+0

複数の問題があります。 DataGridは全体として単一のストップですが、問題は、TabIndexプロパティとTabで最大の番号を持つコントロールをもう一度トラバースすると、データグリッドの行に移動し、Tabキーを使用するともう少し時間が経過し続けることですそれは行ごとに行なわれます。それは受け入れられません。行を移動するには、矢印キーのみを使用します。また、データグリッドへの最初の正しい訪問中に、私は矢印キーを使用すると、それは行のいずれも選択しません。次のまたは前のコントロールに移動します。したがって、第1および第2のフィーチャは適切に機能しない。 – Dawid

答えて

3

だから、あなたに私の提案はこれです:私は、データグリッドにPreviewKeyDownイベントを追加した、と私は、各セルからセル選択を削除した

<DataGrid x:Name="DocumentTemplatesGrid" 
       Grid.Row="2" 
       ItemsSource="{Binding Items}" 
       IsReadOnly="True" 
       AutoGenerateColumns="False" 
       SelectionMode="Single" 
       SelectionUnit="FullRow" 
       TabIndex="1" 
       IsTabStop="True" 
       PreviewKeyDown="DocumentTemplatesGrid_PreviewKeyDown"> 
     <DataGrid.CellStyle> 
      <Style TargetType="DataGridCell"> 
       <Setter Property="IsTabStop" Value="False"/> 
       <Setter Property="BorderThickness" Value="0"/> 
       <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
      </Style> 
     </DataGrid.CellStyle> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Setter Property="IsTabStop" Value="False"/> 
      </Style> 
     </DataGrid.RowStyle> 

。結果として、選択が行にのみあるように見えます。

の背後にあるコードでは

、これはスペースでリンクを開くものです/入力します。

private void DocumentTemplatesGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     if (e.Key == System.Windows.Input.Key.Space || e.Key == System.Windows.Input.Key.Enter) 
     { 
      if (e.Source is DataGrid) 
      { 
       string navigationUri = ((e.Source as DataGrid).SelectedItem as Class).Name; 
       Process.Start(navigationUri); 
      } 
      e.Handled = true; 
     } 
    } 

希望、これはあなたが探しているものである、またはいくつかの助けの少なくとも。

関連する問題