Domanda

Ho un toolkit datagrid WPF con colonne mulitple. Sto cercando di ottenere un comportamento in cui è possibile scheda nella griglia utilizzando la scheda, quindi la scheda di nuovo utilizzando una singola scheda. Per esempio. Non voglio alla scheda attraverso tutte le colonne o le celle della griglia, solo una volta, e una volta fuori.

C'è una soluzione semplice, ho provato a regolare il TabNavigation alla volta, insieme con disattivazione TabStop (non mostrato in codice qui sotto) e l'impostazione TabNavigation sulle colonne a nessuno, ma senza successo.

C'è qualcosa che mi manca o ho bisogno di gestire la scheda-chiave nel 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>
È stato utile?

Soluzione

E 'interessante il fatto che l'impostazione del KeyboardNavigation direttamente sul DataGridTextColumn del non funziona. Un'alternativa che dovrebbe funzionare è quello di creare uno stile di 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 si selezionano righe pieno e non hanno SelectionUnit = "cellulare" impostato sul DataGrid, continuerà a scorrere ogni colonna della riga selezionata.

Al contrario, 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 applicato a tutti DataGridCells di default e spegnendo TabStop, e uno stile a chiave che consente la selezione quando è selezionata la cella (o intera riga). L'applicazione di questo stile per una singola colonna ci darà lo stesso singolo-tab-in effetti, consentendo l'intera riga e tutto questo di colonne da selezionare.

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

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

Altri suggerimenti

Grazie rmoore. Per ottenere il punto di tabulazione per essere disattivato per le colonne ho preso la tua risposta e modificato leggermente;

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

Quindi trucchi;

  1. SelectionUnit = "FullRow" rende l'aspetto della GUI come si sta facendo le cose una riga alla volta (come avrei voluto).
  2. Con l'aggiunta di un CellStyle alle colonne che voglio disabilitare TabStop a (ma non compresi in quelli vorrei fermare in) mi ha permesso di prendere il controllo che le cellule che scheda-chiave potrebbe navigare in. -. La KeyboardNavigation.TabNavigation non avere un effetto se definito su colonne

So che questa è una domanda molto vecchio, ma sto postando questo qui, in caso aiuta qualcuno. Mentre la risposta accettata è buono, non credo che copre il caso in cui ci sia un altro controllo della stessa finestra, e vi piacerebbe scheda in DataGrid da quel controllo. Inoltre, si consiglia il comportamento come descritto nella domanda iniziale (singola scheda a singola scheda, nessun tabbing attraverso cellule / colonne). Questa soluzione si propone di raggiungere questo obiettivo.

Nota: Questa soluzione è supponendo che si desidera la vostra SelectionUnit da FullRow nel vostro DataGrid

.

In primo luogo, qui è la Style da applicare al DataGrid:

<DataGrid.Resources>
    <Style TargetType="DataGridRow">
        <Style.Setters>
            <Setter Property="Focusable" Value="True"/>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="IsSelected" Value="True"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="DataGridCell">
        <Style.Setters>
            <Setter Property="Focusable" Value="False"/>
        </Style.Setters>
    </Style>
</DataGrid.Resources>

Questo stile consente fuoco su righe ma impedisce concentrarsi su singole cellule, che mantiene l'attenzione coerente con la SelectionUnit di FullRow. Il trigger impostato all'interno di questo stile è facoltativo -. È necessario solo se si desidera selezionare automaticamente la riga quando riceve messa a fuoco

Nel mio caso, ho voluto la scheda singola in / out scheda comportamento, così ho anche impostare la proprietà KeyboardNavigation.TabNavigation sul mio DataGrid = "Una volta".

<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">

Con questo approccio, posso ancora usare i tasti freccia su / giù per scorrere le righe una volta che il DataGrid riceve lo stato attivo, ma posso ancora scheda in fretta se voglio spostare lo stato attivo al controllo successivo nell'ordine di tabulazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top