Як я можу встановити колір вибраного рядка в DataGrid


127

Колір фонового кольору вибраного рядка в DataGrid настільки темний, що я не можу його прочитати. Чи все-таки це перекреслює?

Спробував це

<dg:DataGrid.RowStyle>
    <Style TargetType="{x:Type dg:DataGridRow}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True" >
                <Setter Property="Background" Value="Gainsboro" />
            </Trigger>
        </Style.Triggers>
    </Style>
</dg:DataGrid.RowStyle>

Але все одно нічого ...


Коли ви говорите «спробував це», ви маєте на увазі, що ви спробували це, і це не вийшло?
Полковник Паніка

2
Так, це що означає @ColonelPanic
co2f2e

Відповіді:


156

Вищевказаний розчин залишив синю межу навколо кожної комірки в моєму випадку.

Це рішення, яке працювало на мене. Це дуже просто, просто додайте це до свого DataGrid. Ви можете змінити його SolidColorBrushна будь-яку іншу кисть, наприклад, лінійний градієнт.

<DataGrid.Resources>
  <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
                   Color="#FF0000"/>
</DataGrid.Resources>

Ідеально - саме те, що мені було потрібно. Дозволено мені продовжувати посилатися на існуючий стиль для DG і змінювати фон пензлем для вибраного рядка.
Гатмандо

5
непомітний. Будь-яка ідея про те, як зробити те ж саме для кольору переднього плану?
Арсен Захрай

8
Арсен, просто перекрийте пензлик для SystemColors.HighlightTextBrushKey таким же чином, щоб встановити колір тексту.
Бен Макінтош

Якщо я все-таки виберу весь рядок через прив'язку даних, наприклад, <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"рядок є лише LightGrey. Чи є також SystemColors? ´
Rolfi

6
Нарешті знайшов один , якщо він не має фокусу: SystemColors.ControlBrushKey.
Ролфі

100

Зрозумів. Додайте наступне в розділ DataGrid.Resources:

  <DataGrid.Resources>
     <Style TargetType="{x:Type dg:DataGridCell}">
        <Style.Triggers>
            <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
                <Setter Property="Background" Value="#CCDAFF" />
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

Це чудово, я просто натрапив на це, і я розчарувався :-)
Роб

6
У який розділ ви це вкладаєте?
Полковник Паніка

7
Оскільки BorderBrushзалишається блакитним, якщо це когось дратує, просто додайте ще один Setterелемент, який встановлює BorderBrushвластивість залежності на той же колір (значення), що і Backgroundсам.
кай

75

Як додаток до відповіді @Seb Kade, ви можете повністю керувати кольорами вибраних та невибраних рядків, використовуючи наступне Style:

<Style TargetType="{x:Type DataGridRow}">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
    </Style.Resources>
</Style>

Ви, звичайно, можете вводити потрібні кольори. Це Styleтакож буде працювати і для інших елементів колекції , такі як ListBoxItemз (якщо замінити TargetType="{x:Type DataGridRow}"з TargetType="{x:Type ListBoxItem}", наприклад).


6
Ваше найкраще рішення.
Розробник

Приємно, Шерідан. Я також хочу, щоб колір переднього плану мого ряду був у вибраному рядку. але він вимагає HighlightTextBrushKey (тобто чорний). що робити?
смерть

1
@ deathrace.dj, Якщо я вас правильно зрозумів, то вам просто потрібно змінити Colorвластивість третього SolidColorbrushв моєму прикладі на той колір, який вам подобається. Використання цієї декларації фактично встановлює колір того, SolidColorbrushякий SystemColors.HighlightTextBrushKeyвикористовує. Будьте обережні, хоча ви не встановили Foregroundколір в іншому Styleіншому місці, оскільки це може змінити параметри Resourcesвище.
Шерідан

Дякую, саме це я шукав!
Енріко

Ви також можете встановити прозору кисть SystemColors.InactiveSelectionHighlightBrushKey, або рядок виділиться, коли сітка втратить фокус
dlf

19

У мене була ця проблема, і я майже вирвав волосся, і я не зміг знайти відповідну відповідь в мережі. Я намагався контролювати колір тла вибраного рядка у WPF DataGrid. Це просто не зробить. У моєму випадку причиною було те, що у мене також був CellStyle в моїй сітці даних, і CellStyle перемінив RowStyle, який я встановлював. Цікаво, що CellStyle навіть не встановив колір тла, а замість цього Bing задав властивості RowBackground та AlternateRowBackground. Тим не менш, намагання встановити колір тла для вибраного рядка взагалі не вийшло, коли я це зробив:

        <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
            </Style>
        </DataGrid.CellStyle>

і це спрацювало, коли я перемістив потрібний стиль для вибраного рядка зі стилю рядка та у стиль комірки, наприклад:

    <DataGrid ... >
        <DataGrid.RowBackground>
            ...
        </DataGrid.RowBackground>
        <DataGrid.AlternatingRowBackground>
            ...
        </DataGrid.AlternatingRowBackground>
        <DataGrid.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Foreground" Value="{Binding MyProperty}" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Pink"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.CellStyle>

Просто опублікуйте це у випадку, якщо хтось має таку ж проблему.


Це відбувається щоразу, клітина встановлює передній план, і кожне тіло націлює на рядок.
eran otzap

1
Я також наткнувся на це, і я навіть не встановлюю CellStyle. Коли я спробував встановити це на стилі рядка, це вплинуло лише на неклітинні елементи.
BigSandwich

12

Тригер IsSelected за замовчуванням змінює 3 властивості, фон, передній план та межу. Якщо ви хочете змінити межу, а також тло, просто включіть це в свій тригер стилю.

<Style TargetType="{x:Type dg:DataGridCell}">
    <Style.Triggers>
        <Trigger Property="dg:DataGridCell.IsSelected" Value="True">
            <Setter Property="Background" Value="#CCDAFF" />
            <Setter Property="BorderBrush" Value="Black" />
        </Trigger>
    </Style.Triggers>
</Style>

@Mark H, замість того, щоб вносити суттєві зміни до цієї відповіді в кінці гри, вам слід додати власну відповідь.
Майкл Петротта

9

Деякі причини, через які я пережив вибрану подію, не працювали

  1. Стиль налаштований для DataGridCell
  2. Використання шаблонів стовпців
  3. Тригер встановлюється на DataGridRow

Це мені допомогло. Встановлення стилю для DataGridCell

<Style TargetType="{x:Type DataGridCell}">
  <Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
      <Setter Property="Background" Value="Green"/>
      <Setter Property="Foreground" Value="White"/>
    </Trigger>
  </Style.Triggers> 
</Style>

А оскільки я використовував стовпець шаблону з міткою всередині, я прив’язав властивість Foreground до контейнера Foreground, використовуючи прив'язку RelativeSource:

<DataGridTemplateColumn>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Label Content="{Binding CategoryName,
                 Mode=TwoWay,
                 UpdateSourceTrigger=LostFocus}"
             Foreground="{Binding Foreground,
                 RelativeSource={RelativeSource Mode=FindAncestor,
                     AncestorLevel=1, 
                     AncestorType={x:Type DataGridCell}}}"
             Width="150"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

4

Я спробував ControlBrushKey, але він не працював для невибраних рядків. Фон для невибраного ряду все ще був білим. Але мені вдалося з’ясувати, що я повинен перекрити стиль стилю.

<DataGrid x:Name="pbSelectionDataGrid" Height="201" Margin="10,0"
          FontSize="20" SelectionMode="Single" FontWeight="Bold">
    <DataGrid.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFFDD47C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FFA6E09C"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Violet"/>
    </DataGrid.Resources>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="Background" Value="LightBlue" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>

2

Більшу частину дня я провів, обмінюючись цією проблемою. Виявилося, що власність RowBackground на DataGrid - яку я встановив - перекрила всі спроби змінити її. Як тільки я його видалив, все спрацювало. (До речі, те саме стосується переднього плану, встановленого в DataGridTextColumn).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.