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

Wpf: DataGrid отключает выбранные стили строк - или выбор строки

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

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

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

или..

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

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

4b9b3361

Ответ 1

вычислил 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>

Ответ 2

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

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="IsHitTestVisible" Value="False"/>
</Style>

Ответ 3

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

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

Ответ 4

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

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

Это отключает весь выбор в DataGrid.

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

Ответ 5

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

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

Однако это изменяет стиль текста, поскольку сама строка теперь отключена. Это также не отрицает тот факт, что пользователь может щелкнуть правой кнопкой мыши по строке, чтобы выбрать ее. Если вы действительно хотели отключить любое взаимодействие со строками 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 при выборе строки, как показано ниже (выбрана первая строка).

введите описание изображения здесь

Ответ 6

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

<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 - это текст, когда выбор неактивен

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