2016-10-29 51 views
5

Mam Window z kilkoma kontrolkami na nim. Jednym z nich jest DataGrid. Chcę zaimplementować pewne domyślne przejście z fokusem. Mianowicie:Jak uczynić DataGrid pojedynczym przystankiem jako całokształt na przesunięciu ostrości przy wyborze wiersza klawiszy strzałek?

  • DataGrid to pojedynczy przystanek jako całość, a nie każdy wiersz.
  • Po ustawieniu ostrości na DataGrid użytkownik może poruszać się między wierszami za pomocą klawiszy strzałek w górę i w dół.
  • Poruszanie się po kolumnach przy użyciu lewego i prawego klawisza jest niedozwolone.
  • Pierwsza kolumna (i jedyna odpowiednia dla nawigacji) jest typu DataGridHyperlinkColumn. Kiedy użytkownik natrafia na klawisz spacji lub klawisz Enter, wykonuje hiperlink.

Obecnie mam następujący kod:

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

Niestety, to nie osiągnie moje oczekiwania. Proszę wyjaśnić, jak to osiągnąć?

+0

Do której z 4 funkcji potrzebujesz pomocy? TabStops (1) i nawigacja góra-dół (2) działały zgodnie z oczekiwaniami, gdy próbowałem cię kod – ASh

+0

Jest z nim wiele problemów. DataGrid jest pojedynczym stopem jako całości, ale problem polega na tym, że kiedy przechodzę do kontrolki, która ma największą liczbę w właściwości TabIndex i TAB po raz kolejny, przechodzi przez wiersze siatki danych i za pomocą TAB jeszcze kilka razy kontynuuje przechodzenie to wiersz po wierszu. To nie do przyjęcia. Poruszanie się po wierszach powinno odbywać się tylko za pomocą klawiszy strzałek. Co więcej, podczas pierwszej poprawnej wizyty w siatce danych, kiedy używam klawisza strzałki, nie wybieram żadnego z wierszy. Przechodzi do następnej lub poprzedniej kontroli. Tak więc pierwsza i druga funkcja nie działają poprawnie. – Dawid

Odpowiedz

3

Więc moja propozycja dla Ciebie jest taka:

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

Dodałem zdarzenie PreviewKeyDown na DataGrid, a ja usunięte zaznaczenie komórek z każdej komórki. W rezultacie wygląda na to, że wybór jest tylko w wierszu.

W kodzie tyłu, to jest to, co otwiera linków z miejsca/Enter:

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

nadzieję, że to, czego szukasz, lub przynajmniej jakiejś pomocy.