2010-01-21 11 views
13

Ich habe ein WPF-Toolkit-Datagrid mit mehreren Spalten. Ich versuche, ein Verhalten zu erzielen, bei dem Sie über Tab auf das Raster zugreifen können und dann mit einem einzigen Tab wieder Tabulator erstellen. Z.B. Ich möchte nicht alle Spalten oder Zellen des Rasters durchblättern, nur einmal und einmal aus.Tabstopp zwischen Spalten in einem WPF-Datagrid deaktivieren

Gibt es eine einfache Lösung, ich habe versucht, die TabNavigation auf Einmal, TabStop (nicht im Code unten) deaktivieren und TabNavigation für die Spalten auf None, aber ohne Erfolg.

Gibt es etwas, das ich vermisse oder muss ich die Tab-Taste im Code behandeln?

 <my:DataGrid Name="datagrid" 
        AutoGenerateColumns="False" IsReadOnly="True" 
        CanUserAddRows="False" CanUserDeleteRows="False" 
        Background="White" 
        KeyboardNavigation.TabNavigation="Once"> 
      <my:DataGrid.Columns> 
       <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn> 
       <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn> 
       <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn> 
      </my:DataGrid.Columns> 
     </my:DataGrid> 
+0

http://stackoverflow.com/questions/858938/wpf-toolkit-datagrid-custom-tabbing/1707920#1707920 – Bermo

Antwort

17

Es ist interessant, dass die KeyboardNavigation direkt auf die DataGridTextColumns nicht funktioniert. Eine Alternative, die funktionieren sollte, ist das Einrichten eines DataGridCell-Stils.

<toolkit:DataGrid.CellStyle> 
    <Style TargetType="{x:Type toolkit:DataGridCell}"> 
     <Setter Property="KeyboardNavigation.IsTabStop" 
       Value="False" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" 
        Value="True"> 
       <Setter Property="KeyboardNavigation.IsTabStop" 
         Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</toolkit:DataGrid.CellStyle> 

das Anbringen an das Datagrid wird sichergestellt, dass eine Zelle nur eine TabStop ist, wenn es bereits aktiviert ist. Wenn Sie jedoch vollständige Zeilen auswählen und SelectionUnit = "Cell" nicht auf dem DataGrid gesetzt haben, wird die Spalte immer noch durch jede Spalte der aktuell ausgewählten Zeile gecycelt.

<toolkit:DataGrid.Resources> 

    <Style x:Key="SelectableCellStyle" 
      TargetType="{x:Type toolkit:DataGridCell}"> 
     <Setter Property="KeyboardNavigation.IsTabStop" 
       Value="False" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" 
        Value="True"> 
       <Setter Property="KeyboardNavigation.IsTabStop" 
         Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

    <Style TargetType="{x:Type toolkit:DataGridCell}"> 
     <Setter Property="KeyboardNavigation.IsTabStop" 
       Value="False" /> 
    </Style> 

</toolkit:DataGrid.Resources> 

Jetzt haben wir einen Stil angewendet werden auf alle DataGridCells von Ausfall- und Ausschalten TabStop und einem Schlüssel Stil, der Auswahl erlaubt, wenn das:

Stattdessen können wir mehrere angewendete Cellstyles als Ressourcen innerhalb des Datagrid erstellen Zelle (oder ganze Zeile) ist ausgewählt. Wenn Sie diesen Stil nur auf eine einzelne Spalte anwenden, erhalten Sie denselben Single-Tab-In-Effekt, während Sie gleichzeitig die gesamte Zeile und alle zugehörigen Spalten auswählen können.

<my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource SelectableCellStyle}"/> 

Das hält auch in die Datagrid-Tabbing wenn nichts ausgewählt ist, die bevorzugt werden können oder nicht in Abhängigkeit von der Situation, die Sie es in verwenden.

10

Danke rmoore. Um den Tabstopp für Spalten deaktivieren zu lassen, nahm ich Ihre Antwort und änderte sie leicht;

 <my:DataGrid Name="datagrid" 
       AutoGenerateColumns="False" IsReadOnly="True" 
       CanUserAddRows="False" CanUserDeleteRows="False" 
       Background="White" 
       KeyboardNavigation.TabNavigation="Once" 
       SelectionUnit="FullRow"> 
     <my:DataGrid.Columns> 
      <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn> 
      <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*"> 
        <my:DataGridTextColumn.CellStyle> 
         <Style TargetType="{x:Type my:DataGridCell}"> 
          <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter> 
         </Style> 
        </my:DataGridTextColumn.CellStyle> 
      </my:DataGridTextColumn> 

      <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*"> 
        <my:DataGridTextColumn.CellStyle> 
         <Style TargetType="{x:Type my:DataGridCell}"> 
          <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter> 
         </Style> 
        </my:DataGridTextColumn.CellStyle> 
      </my:DataGridTextColumn> 
     </my:DataGrid.Columns> 
    </my:DataGrid> 

Also Tricks;

  1. SelectionUnit = "FullRow" lässt die GUI so aussehen, als würden Sie eine Zeile nach der anderen tun (wie ich es wollte).
  2. Durch das Hinzufügen eines CellStyle zu den Spalten, in denen ich TabStop deaktivieren möchte (aber nicht in denen ich mich aufhalten möchte), erlaubte ich mir die Kontrolle darüber, in welche Zellen diese Tab-Taste navigieren würde. - Die KeyboardNavigation.TabNavigation hat keinen Effekt, wenn sie in Spalten definiert ist.
Verwandte Themen