15

複数の列を持つWPFツールキットデータグリッドがあります。タブを使用してグリッドにタブインし、単一のタブを使用して再度タブアウトできる動作を取得しようとしています。たとえば、グリッドのすべての列またはセルを1回だけタブで移動したり、1回だけタブで移動したりする必要はありません。

簡単な解決策はありますか?TabStopを無効にし(以下のコードには示されていません)、列のTabNavigationをNoneに設定するとともに、TabNavigationをOnceに設定しようとしましたが、成功しませんでした。

足りないものがありますか、それともコードでTabキーを処理する必要がありますか?

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

3 に答える 3

21

DataGridTextColumnに直接KeyboardNavigationを設定しても機能しないのは興味深いことです。動作するはずの代替手段は、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>

これをDataGridにアタッチすると、セルがすでに選択されている場合にのみ、セルがTabStopになります。ただし、完全な行を選択していて、DataGridでSelectionUnit = "Cell"が設定されていない場合でも、現在選択されている行の各列を循環します。

代わりに、DataGrid内のリソースとして複数のCellStylesを作成できます。

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

これで、デフォルトですべてのDataGridCellに適用され、TabStopがオフになるスタイルと、セル(または行全体)が選択されたときに選択できるキー付きスタイルができました。このスタイルを単一の列にのみ適用すると、同じ単一タブイン効果が得られ、行全体とそのすべての列を選択できます。

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

これにより、何も選択されていない場合でもDataGridへのタブ移動が停止します。これは、使用している状況に応じて優先される場合とされない場合があります。

于 2010-01-21T19:17:18.443 に答える
10

rmooreありがとうございます。列のタブストップを無効にするために、私はあなたの答えを受け取り、それを少し変更しました。

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

だからトリック;

  1. SelectionUnit = "FullRow"を使用すると、GUIは、一度に1行ずつ実行しているように見えます(私が望んでいたように)。
  2. でTabStopを無効にしたい列にCellStyleを追加することで(ただし、停止したい列には含めないで)、Tabキーで移動するセルを制御できるようになりました。-KeyboardNavigation.TabNavigationは、列に定義されている場合は効果がありません。
于 2010-01-22T08:57:53.380 に答える
1

これは本当に古い質問ですが、誰かに役立つ場合に備えて、ここに投稿します。DataGrid受け入れられた答えは良いですが、同じウィンドウに別のコントロールがある場合はカバーされていないと思います。そのコントロールからタブに移動したいと思います。さらに、元の質問で説明されている動作(単一のタブイン、単一のタブアウト、セル/列をタブで移動しない)が必要になる場合があります。このソリューションは、これを実現することを目的としています。

注:SelectionUnitこのソリューションは、あなたがあなたの中にいることを望んでいることを前提とFullRowしていますDataGrid

まず、これがStyleに適用するもの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>

このスタイルでは、行に焦点を合わせることができますが、個々のセルに焦点を合わせることができないため、の焦点と一貫性が保たれSelectionUnitますFullRow。このスタイル内に設定されたトリガーはオプションです。フォーカスを受け取ったときに行を自動的に選択する場合にのみ必要です。

私の場合、単一のタブイン/タブアウトの動作が必要だったので、KeyboardNavigation.TabNavigationプロパティをmy DataGrid="Once"にも設定しました。

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

このアプローチでは、DataGridフォーカスを受け取った後でも上/下矢印キーを使用して行を循環できますが、タブ順でフォーカスを次のコントロールに移動したい場合は、すばやくタブアウトできます。

于 2019-06-08T18:55:22.850 に答える