wpf: DataGrid отключает выбранные стили строк или выбор строк - PullRequest
41 голосов
/ 15 июня 2010

Я вижу много примеров того, как стилизовать выбранные строки в DataGrid, например:

Как мне установить цвет выбранной строки в DataGrid

Могу ли я просто отключить стиль выбранной строки?я не хочу переопределять каждую вещь, которая изменяет выбранную строку.Просто не хочу никаких видимых изменений.Должен быть более простой способ, чем создавать шаблоны ..

или ..

отключить выбор строк, если это проще ... но при просмотре этого форума это тоже кажется хакерским

Отключить выбор в WPF DataGrid

Ответы [ 6 ]

72 голосов
/ 19 июня 2010

выяснил XAML, чтобы избавиться от стиля выделения .. не идеально, но достаточно близко ..

<Style x:Key="CellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>
21 голосов
/ 10 апреля 2015

Вот что у меня сработало:

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Foreground"
                            Value="{DynamicResource
                                   {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background">
                        <Setter.Value>
                            <SolidColorBrush Color="Transparent"/>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!-- ... -->
</DataGrid>
17 голосов
/ 14 августа 2010

Я нашел другой способ, который хорошо подходит для моей ситуации.Я установил этот стиль для всех ячеек, потому что я не хочу, чтобы пользователь выбирал ячейки.

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsHitTestVisible" Value="False"/>
</Style>
8 голосов
/ 05 августа 2016

Сначала я отвечу на второй вопрос: чтобы отключить выбор строк, вы можете изменить RowStyle вашей DataGrid.

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsEnabled" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

Тем не менее, это меняет стиль текста, так как сама строка теперь "отключен".Это также не отменяет тот факт, что пользователь все еще может щелкнуть правой кнопкой мыши по строке, чтобы выбрать ее.Если вы действительно хотите отключить любое взаимодействие со строками таблицы данных, вы можете сделать следующее:

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

Поскольку строки все еще включены, стиль текста не изменяется.

Теперь, если вы хотите только изменить стиль выбранной строки, но оставить функциональность в покое, вы можете сделать следующее (что в основном совпадает с ответом @Dan Stevens). ControlTextBrushKey - это кисть, которая используется системой для окрашивания текстовых элементов.Пожалуйста, посмотрите на этот ответ для объяснения между DynamicResource и StaticResource.

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <Trigger Property="DataGridCell.IsSelected" Value="True">
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                    <Setter Property="Background" Value="Transparent"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGrid.CellStyle>
    <!--Other DataGrid items-->
</DataGrid>

Важно отметить, что вышеприведенное решение не меняет стиль DataGridRowHeader при выборе строки,как видно ниже (выбран первый ряд).

enter image description here

6 голосов
/ 16 июня 2010

Это относительно просто:

datagrid.SelectionChanged += (obj, e) =>
  Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
    datagrid.UnselectAll()));

Это отключает все выделения в DataGrid.

Если вы не хотите полностью отключить выделение, а просто скрыть его, вам нужноизменить шаблон.

1 голос
/ 08 февраля 2017

Для тех, кто, как я, имеет несколько ячеек с разными стилями и не хочет переопределять все стили и добавлять триггеры к каждому стилю, это хорошая ставка:

<DataGrid.Resources>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        Color="#333333"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
        Color="Black"/>
    <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" 
        Color="Black"/>
</DataGrid.Resources>

HighlightBrushKey - этовыделенная граница с активным выделением и HighlightTextBrushKey - это цвет текста с активным выделением

В моем случае я хочу, чтобы неактивное выделение выглядело невыделенным:

InactiveSelectionHighlightBrushKey - это граница, когда выделение неактивнои InactiveSelectionHighlightTextBrushKey - это текст, когда выделение неактивно

К вашему сведению: SystemColors - это статический класс, часть пространства имен System.Windows.Media.Вы можете проверить это и бесстыдно переопределить любой цвет, который вам не нравится!

...