Отключить текущую границу ячейки DataGrid в режиме выделения FullRow - PullRequest
48 голосов
/ 28 декабря 2010

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

Ответы [ 5 ]

97 голосов
/ 28 декабря 2010

Вы можете установить 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>
9 голосов
/ 04 июня 2015

Увидел еще один ответ, который был близок, но он не избавился от прямоугольника Фокуса. Вот как стереть все границы.

<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>

Наслаждайтесь! :)

6 голосов
/ 05 марта 2012
<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>
0 голосов
/ 16 ноября 2014

Если вы используете xceed DataGridControl, установите NavigationBehavior на RowOnly

<xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single"  ....
0 голосов
/ 07 октября 2014

Если вы хотите показать границу только тогда, когда ячейка редактируема и выбрана, вы можете переопределить шаблон 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...