2010-01-21 27 views
13

Tôi có một DataGrid của WPF Toolkit với các cột mulitple. Tôi đang cố gắng để có được một hành vi mà bạn có thể tab vào lưới bằng cách sử dụng tab, sau đó tab ra một lần nữa bằng cách sử dụng một tab duy nhất. Ví dụ. Tôi không muốn duyệt qua tất cả các cột hoặc ô của lưới, chỉ một lần trong và một lần. Có một giải pháp đơn giản, tôi đã thử đặt TabNavigation thành Once, cùng với vô hiệu hóa TabStop (không được hiển thị trong mã bên dưới) và thiết lập TabNavigation trên các cột thành None, nhưng không thành công.Vô hiệu hóa tabstop giữa các cột trong một DataFrid WPF

Có điều gì tôi thiếu hoặc tôi có cần xử lý mã khóa trong mã không?

 <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

Trả lời

17

Thật thú vị khi đặt KeyboardNavigation trực tiếp trên DataGridTextColumn không hoạt động. Một giải pháp thay thế nên hoạt động là thiết lập kiểu 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> 

Việc đính kèm này vào DataGrid sẽ đảm bảo rằng ô chỉ là một TabStop nếu nó đã được chọn. Tuy nhiên, nếu bạn đang chọn hàng đầy đủ và không có SelectionUnit = "Cell" được đặt trên DataGrid, nó sẽ vẫn chu kỳ qua từng cột của hàng hiện đang được chọn.

Thay vào đó, chúng ta có thể tạo nhiều CellStyles như nguồn lực trong 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> 

Bây giờ chúng ta có một phong cách được áp dụng cho tất cả các DataGridCells theo mặc định và tắt tabstop, và một phong cách có khóa cho phép lựa chọn khi Ô (hoặc toàn bộ hàng) được chọn. Áp dụng kiểu này cho chỉ một cột duy nhất sẽ cho chúng ta cùng một hiệu ứng tab đơn trong khi cho phép toàn bộ hàng và tất cả các cột của nó được chọn.

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

này cũng không dừng tabbing vào DataGrid nếu không có gì được chọn, trong đó có thể được ưa thích hay không tùy thuộc vào tình huống mà bạn đang sử dụng nó trong.

10

Cảm ơn bạn rmoore. Để ngăn chặn tab bị vô hiệu hóa cho các cột, tôi lấy câu trả lời của bạn và sửa đổi nó một chút;

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

Vì vậy, các thủ thuật;

  1. SelectionUnit = "FullRow" làm cho giao diện giống như bạn đang thực hiện một hàng tại một thời điểm (như tôi muốn).
  2. Bằng cách thêm một CellStyle vào các cột tôi muốn vô hiệu hóa TabStop (nhưng không bao gồm nó trong những người tôi muốn dừng lại) cho phép tôi kiểm soát các ô mà tab-key sẽ điều hướng. - KeyboardNavigation.TabNavigation không có hiệu lực khi được xác định trên cột.
Các vấn đề liên quan