Отключить остановку табуляции между столбцами в сетке данных WPF
-
22-09-2019 - |
Вопрос
У меня есть WPF Toolkit datagrid с несколькими столбцами.Я пытаюсь добиться поведения, при котором вы можете переходить в сетку с помощью tab, а затем снова выходить из нее с помощью одной вкладки.Например.Я не хочу прокручивать все столбцы или ячейки сетки, только один раз входя и один раз выходя.
Есть ли простое решение, я попытался установить 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>
Решение
Интересно, что установка KeyboardNavigation непосредственно в DataGridTextColumn не работает.Альтернативой, которая должна сработать, является настройка стиля 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 гарантирует, что ячейка является табуляцией только в том случае, если она уже выбрана.Однако, если вы выбираете полные строки и в DataGrid не установлено значение SelectionUnit="Cell", оно все равно будет циклически проходить по каждому столбцу текущей выбранной строки.
Вместо этого мы можем создать несколько стилей ячеек в качестве ресурсов в 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>
Теперь у нас есть стиль, применяемый ко всем ячейкам DataGridCells по умолчанию и отключающий TabStop, а также стиль с ключом, который разрешает выделение при выделении ячейки (или всей строки).Применение этого стиля только к одному столбцу даст нам тот же эффект с одной вкладкой, позволяя при этом выделить всю строку и все ее столбцы.
<my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource SelectableCellStyle}"/>
Это также останавливает ввод вкладок в DataGrid, если ничего не выбрано, что может быть предпочтительным или нет, в зависимости от ситуации, в которой вы его используете.
Другие советы
Спасибо вам, рмур.Чтобы отключить остановку табуляции для столбцов, я взял ваш ответ и немного изменил его;
<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" делает графический интерфейс похожим на то, что вы делаете что-то по одной строке за раз (как я и хотел).
- Добавление CellStyle к столбцам, в которых я хочу отключить остановку табуляции (но не включение его в те, в которых я хотел бы остановиться), позволило мне взять под контроль, в какие ячейки будет перемещаться клавиша табуляции.- Навигация по клавиатуре.Навигация по вкладкам, не оказывающая влияния при определении для столбцов.
Я знаю, что это действительно старый вопрос, но я размещаю это здесь на случай, если это кому-то поможет.Хотя принятый ответ хорош, я не думаю, что он охватывает случай, когда в том же окне есть другой элемент управления, и вы хотели бы перейти на вкладку 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
собственность на моем DataGrid
= "Однажды".
<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">
При таком подходе я все еще могу использовать клавиши со стрелками вверх / вниз для циклического перемещения по строкам, как только DataGrid
получает фокус, но я все равно могу быстро перейти к табуляции, если хочу переместить фокус на следующий элемент управления в порядке табуляции.