2010-01-21 15 views
13

Ho un datagrid WPF Toolkit con colonne multiple. Sto cercando di ottenere un comportamento in cui è possibile accedere alla griglia utilizzando la scheda, quindi eseguire nuovamente la tabulazione utilizzando una singola scheda. Per esempio. Non voglio sfogliare tutte le colonne o le celle della griglia, solo una volta dentro e una volta fuori.Disabilita tabstop tra le colonne in un datagrid WPF

Esiste una soluzione semplice, ho provato a impostare TabNavigation su Once, insieme a disabilitare TabStop (non mostrato nel codice di seguito) e impostare TabNavigation sulle colonne su None, ma senza esito positivo.

C'è qualcosa che mi manca o devo usare il tasto Tab in codice?

 <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

risposta

17

E 'interessante il fatto che l'impostazione del KeyboardNavigation direttamente sul DataGridTextColumn del non funziona. Un'alternativa che dovrebbe funzionare è impostare uno stile DataGridCell.

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

Collegamento questo al DataGrid farà in modo che una cellula è solo TabStop se è già selezionato. Tuttavia, se selezioni le righe complete e non hai SelectionUnit = "Cell" impostato su DataGrid, continuerà a scorrere in ogni colonna della riga correntemente selezionata.

Invece, siamo in grado di creare più CellStyles come risorse all'interno del DataGrid:

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

Ora abbiamo uno stile di essere applicato a tutte le DataGridCells per impostazione predefinita e spegnendo TabStop, e uno stile a chiave che consente la selezione quando il Cella (o intera riga) è selezionata. Applicare questo stile solo a una singola colonna ci darà lo stesso effetto di tabulazione singola pur consentendo di selezionare l'intera riga e tutte le sue colonne.

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

Ciò anche ferma tabulazione nel DataGrid se nulla è selezionato, che può essere preferibile o meno a seconda della situazione che si sta utilizzando in.

10

Grazie rmoore. Per ottenere che il punto di tabulazione sia disabilitato per le colonne, ho preso la tua risposta e l'ho leggermente modificata;

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

Così trucchi;

  1. SelectionUnit = "FullRow" rende la GUI come se si stesse facendo una riga alla volta (come volevo).
  2. Aggiungendo un CellStyle alle colonne che voglio disabilitare TabStop in (ma non includendolo in quelle in cui vorrei fermarmi) mi ha permesso di prendere il controllo su quali celle in cui si trovava la chiave di accesso. - KeyboardNavigation.TabNavigation non ha effetto quando è definito sulle colonne.