Я использую DataGrid в режиме выбора строки (т.е. SelectionUnit="FullRow"
). Я просто хочу удалить границу, которая помещается вокруг текущей ячейки, когда пользователь выделяет строку, чтобы иметь истинную полную строку выбора (и выбора уровня ячейки). Я не возражаю против того, что сетка поддерживает текущую ячейку, я просто хочу удалить эту надоедливую текущую границу ячеек, возможно, изменив стиль текущей ячейки. Каков самый простой способ сделать это?
Отключить текущую границу ячеек DataGrid в режиме выбора FullRow
Ответ 1
Вы можете установить для BorderThickness
для DataGridCell
значение 0
<DataGrid ...
SelectionUnit="FullRow">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<!-- Update from comments.
Remove the focus indication for the selected cell -->
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</DataGrid.CellStyle>
<!-- ... -->
</DataGrid>
Ответ 2
Увидел еще один ответ, который был близок, но он не избавился от прямоугольника Focus. Здесь, как уничтожить все границы.
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</DataGrid.Resources>
Кроме того, поскольку технически эти ячейки по-прежнему получают фокус (вы просто не видите его), чтобы сделать вкладку в следующую строку вместо следующей ячейки, я определяю стиль ячейки на основе выше, но также добавляет следующее...
<DataGrid.Resources>
<Style x:Key="NoFocusDataGridCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
<Setter Property="Focusable" Value="False" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</DataGrid.Resources>
... тогда я применяю это ко всем, кроме определения первого столбца. Таким образом, клавиша табуляции переходит к следующей строке, а не к следующей ячейке.
Вернемся к границам. Если вы хотите скрыть их, но все же хотите, чтобы они были частью макета для разметки, измените приведенное выше на это...
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</DataGrid.Resources>
Наслаждайтесь!:)
Ответ 3
<Style x:Key="DataGrid" TargetType="DataGrid">
<Setter Property="CellStyle">
<Setter.Value>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" />
<Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" />
</Style>
</Setter.Value>
</Setter>
</Style>
Ответ 4
Если вы хотите показать границу только в том случае, когда ячейка редактируется и выбрана, вы можете переопределить шаблон DataGridCell и добавить мультитриггер, когда ячейка IsSelected, а не IsReadOnly. Тогда никакая граница не будет показана для ячеек, если вы установите IsReadOnly = true для столбца или DataGrid
<ControlTemplate x:Key="MellowDataGridCellTemplate" TargetType="{x:Type DataGridCell}">
<Grid>
<ContentPresenter VerticalAlignment="Center" />
<Rectangle Name="FocusVisual" Stroke="White" StrokeThickness="1" Fill="Transparent" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" />
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsReadOnly" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="FocusVisual" Property="Opacity" Value="1"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Используйте шаблон в стиле
<Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell">
<Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" />
</Style>
И используйте стиль
<DataGrid CellStyle={StaticResource MellowGridDataGridCell >
...
</DataGrid>
Ответ 5
Если вы используете xceed
DataGridControl
, установите для параметра NavigationBehavior
значение RowOnly
<xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single" ....