Отключить tabstop между столбцами в WPat datagrid
У меня есть набор инструментов WPF Toolkit с многолистовыми столбцами. Я пытаюсь получить поведение, в котором вы можете вставить вкладку в сетку с помощью вкладки, а затем снова выполнить вкладку, используя одну вкладку. Например. Я не хочу перебирать все столбцы или ячейки сетки только один раз и один раз.
Есть ли простое решение, я попытался настроить 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>
Ответы
Ответ 1
Интересно, что установка 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 гарантирует, что ячейка будет только TabStop, если она уже выбрана. Однако, если вы выбираете полные строки и не имеете SelectionUnit = "Cell", установленного в DataGrid, он все равно будет циклически перемещаться по каждому столбцу текущей выбранной строки.
Вместо этого мы можем создать несколько CellStyles в качестве ресурсов в 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, если ничего не выбрано, что может быть предпочтительным или нет, в зависимости от ситуации, в которой вы его используете.
Ответ 2
Спасибо, 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>
Итак, трюки;
- SelectionUnit = "FullRow" делает GUI похожим на то, что вы делаете вещи по одной строке за раз (например, я хотел).
- Добавляя CellStyle к столбцам, я хочу отключить TabStop (но не включая его в тех, которые я хотел бы остановить), позволил мне взять контроль над ячейками, в которые будет перемещаться таб-ключ. - KeyboardNavigation.TabNavigation не имеет эффекта, если он определен в столбцах.
Ответ 3
Я знаю, что это действительно старый вопрос, но я публикую его здесь на случай, если он кому-нибудь поможет. Хотя принятый ответ является хорошим, я не верю, что он покрывает случай, когда в этом же окне есть другой элемент управления, и вы хотели бы перейти в DataGrid
из этого 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>
Этот стиль позволяет фокусироваться на строках, но предотвращает фокусировку на отдельных ячейках, что FullRow
фокусировку согласованной с SelectionUnit
от FullRow
. Триггер, установленный внутри этого стиля, является необязательным - он необходим только в том случае, если вы хотите автоматически выбирать строку, когда она получает фокус.
В моем случае я хотел, чтобы поведение одной вкладки входило/выходило, поэтому я также установил свойство KeyboardNavigation.TabNavigation
в свой DataGrid
= "Once".
<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">
При таком подходе я все еще могу использовать клавиши со стрелками вверх/вниз для циклического перемещения по строкам, когда DataGrid
получает фокус, но я все равно могу быстро перемещаться по вкладкам, если я хочу переместить фокус на следующий элемент управления в порядке вкладок.