2010-01-21 31 views
13

Mam datagrid zestawu WPF Toolkit z kolumnami mulitple. Próbuję uzyskać zachowanie, w którym można tabować w siatkę za pomocą karty, a następnie ponownie wypuścić kartę za pomocą jednej karty. Na przykład. Nie chcę przechodzić przez wszystkie kolumny lub komórki siatki, tylko raz i raz na zewnątrz.Wyłącza tabulator między kolumnami w datagrid WPF

Czy istnieje proste rozwiązanie, próbowałem ustawić TabNavigation na Once, wraz z wyłączaniem TabStop (nie pokazano w poniższym kodzie) i ustawieniem TabNavigation w kolumnach na None, ale bez powodzenia.

Czy jest coś, czego mi brakuje lub czy muszę obsługiwać klawisz Tab w kodzie?

 <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

Odpowiedz

17

To ciekawe, że ustawienie KeyboardNavigation bezpośrednio na DataGridTextColumn nie działa. Alternatywą, która powinna działać, jest ustawienie stylu DataGridCell.

Dołączenie tego do elementu DataGrid spowoduje, że komórka będzie tylko tabStopem, jeśli jest już zaznaczona. Jeśli jednak wybierzesz pełne wiersze i nie ustawisz SelectionUnit = "Komórka" na DataGrid, to nadal będzie cyklicznie przechodzić przez każdą kolumnę aktualnie wybranego wiersza.

Zamiast tego, możemy utworzyć wiele CellStyles jak zasoby w 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> 

Teraz mamy styl jest stosowany do wszystkich DataGridCells domyślnie i wyłączanie TabStop i wpust stylu, który pozwala zaznaczenia, gdy Wybrano komórkę (lub cały wiersz). Zastosowanie tego stylu do tylko jednej kolumny da nam ten sam efekt pojedynczej zakładki, jednocześnie umożliwiając wybór całego wiersza i wszystkich jego kolumn.

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

ta ma również zatrzymać tabulatorem do siatki danych, jeśli jest wybrany nic, co może być korzystne lub nie w zależności od sytuacji, której używasz go.

10

Dziękuję rmoore. Aby wyłączyć blokadę tabulatora dla kolumn, wziąłem odpowiedź i nieco ją zmodyfikowałem;

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

Sztuczki;

  1. SelectionUnit = "FullRow" sprawia, że ​​GUI wygląda tak, jakbyś robił rzeczy po jednym rzędzie na raz (tak jak chciałem).
  2. Dodanie CellStyle do kolumn, które chcę wyłączyć TabStop w (ale nie wliczając go do tych, w których chciałbym się zatrzymać) pozwoliło mi przejąć kontrolę nad komórkami, do których nawigował klawisz Tab. - Funkcja KeyboardNavigation.TabNavigation nie ma wpływu na definicję w kolumnach.