WPF データグリッドの列間のタブストップを無効にする
-
22-09-2019 - |
質問
複数の列を持つ WPF ツールキット データグリッドがあります。タブを使用してグリッドにタブインし、単一のタブを使用して再びタブアウトできる動作を取得しようとしています。例えば。グリッドのすべての列またはセルをタブで移動するのではなく、一度入って 1 回だけ出ていきたいと考えています。
簡単な解決策はありますか。TabNavigationをOnceに設定し、TabStopを無効にして(以下のコードには示されていません)、列のTabNavigationをNoneに設定しようとしましたが、成功しませんでした。
何か不足しているものはありますか、それともコード内で 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>
解決
これは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にこれを取り付けるには、細胞が唯一のタブストップであることを保証します。しかし、あなたは完全な行を選択している場合は、データグリッド上のSelectionUnit =「セル」のセットを持っていない、それ意志まだ現在選択されている行の各列を循環ます。
その代わり、我々はデータグリッド内のリソースとして複数の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>
今、私たちは、デフォルトでは、すべてのDataGridCellsに適用されたスタイルとタブストップ消灯、およびセル(または全体行)が選択されたときに選択することができます鍵付きのスタイルを持っています。選択することの列の行全体とすべてを可能にしながら、単一の列にこのスタイルを適用すると、私たちと同じシングルタブで効果が得られます。
<my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource SelectableCellStyle}"/>
何も選択されていない場合は、これは、あなたがそれを使用している状況に応じて優先してもしなくてもよいれます。
、データグリッドにタブ移動もが停止しません他のヒント
ありがとうございます。列のタブストップを無効にするために、あなたの答えを取り入れて少し修正しました。
<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>
それでトリック。
- SelectionUnit="FullRow" を指定すると、(私が望んでいたように) 一度に 1 行ずつ処理を行っているように GUI が表示されます。
- TabStop を無効にしたい列に CellStyle を追加することで (ただし、停止したい列にはそれを含めません)、タブ キーが移動するセルを制御できるようになりました。- KeyboardNavigation.TabNavigation が列に定義されても効果がありません。
私は、これは本当に古い質問ですけど、私はそれが誰かを助けた場合にここにこれを掲示しています。受け入れられた答えは良いですが、私はそれは同じウィンドウ上の別のコントロールがありますケースをカバーして信じていない、とあなたはそのコントロールからDataGrid
にタブにしたいと思います。元の質問(で単一のタブ、1つのタブうち、セル/列を通るタブ移動)で説明したようにまた、あなたが行動をすることもできます。このソリューションでこれを達成することを目指しています。
注:のこのソリューションは、あなたがあなたの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
にDataGrid
プロパティを設定して私の場合、私は、行動外で/タブ単一のタブを望んでいた「たら。」
<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">
私は、タブオーダーの次のコントロールにフォーカスを移動したい場合は、このアプローチでは、私はまだDataGrid
がフォーカスを受け取ると、行を順番に矢印キーをアップ/ダウンを使用することができますが、すぐに私がすることができ、まだタブアウト。