Подтвердить что ты не робот

Отключить текущую границу ячеек DataGrid в режиме выбора FullRow

Я использую DataGrid в режиме выбора строки (т.е. SelectionUnit="FullRow"). Я просто хочу удалить границу, которая помещается вокруг текущей ячейки, когда пользователь выделяет строку, чтобы иметь истинную полную строку выбора (и выбора уровня ячейки). Я не возражаю против того, что сетка поддерживает текущую ячейку, я просто хочу удалить эту надоедливую текущую границу ячеек, возможно, изменив стиль текущей ячейки. Каков самый простой способ сделать это?

4b9b3361

Ответ 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"  ....