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.에 추가하십시오 . a SolidColorBrush에서 선형 그라디언트와 같은 다른 브러시로 변경할 수 있습니다 .

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

완벽-내가 정확히 필요한 것. DG의 기존 스타일을 계속 참조하고 선택한 행의 배경 브러시를 변경할 수있었습니다.
Gatmando

5
상처 자. 전경색과 동일하게 수행하는 방법에 대한 아이디어가 있습니까?
Arsen Zahray 2016 년

8
Arsen은 SystemColors.HighlightTextBrushKey의 브러시를 동일한 방식으로 재정 의하여 텍스트 색상을 설정합니다.
벤 매킨토시

Databinding을 통해 전체 행을 선택 <DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"하면 행은 LightGrey입니다. SystemColors도 있습니까? ´
Rolfi

6
Focus :가없는 경우 마지막으로 찾았습니다 SystemColors.ControlBrushKey.
Rolfi

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>

이것은 대단하다, 나는 단지 이것
Rob

6
어떤 섹션에 넣었습니까?
Colonic Panic

7
BorderBrush파란색으로 남아 있기 때문에 누군가를 귀찮게하면 다른 Setter요소를 추가 하면 BorderBrush종속성 속성이 Background자체 와 동일한 색상 (값)으로 설정 됩니다.
kai

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>

물론 원하는 색상을 입력 할 수 있습니다. 이는 s Style와 같은 다른 수집 항목에도 적용됩니다 ListBoxItem( 예를 들어 교체 TargetType="{x:Type DataGridRow}"하는 TargetType="{x:Type ListBoxItem}"경우).


6
귀하의 솔루션이 가장 좋습니다.
개발자

좋아, 셰리 던 또한 선택한 행에서 행의 전경색을 원합니다. 그러나 기본 HighlightTextBrushKey (예 : 검은 색)가 필요합니다. 무엇을해야합니까?
deathrace 2019

1
@ deathrace.dj, 내가 당신을 올바르게 이해한다면, 당신 은 내 예제 Color에서 세 번째 의 속성 SolidColorbrush을 원하는 색상 으로 변경해야합니다 . 이 선언을 사용하여 실제의 색 설정되는 SolidColorbrush것을 SystemColors.HighlightTextBrushKey사용합니다. Foreground다른 Style곳 에서는 색상을 설정하지 않았으므로 Resources위 의 설정을 무시할 수 있으므로주의하십시오 .
Sheridan

고마워, 이것은 내가 찾던 것입니다!
Enrico

에 대한 투명 브러시를 설정 SystemColors.InactiveSelectionHighlightBrushKey하거나 그리드의 포커스가
없어지면

19

나는이 문제가 있었고 머리카락이 거의 찢어졌고 그물에서 적절한 대답을 찾을 수 없었습니다. WPF DataGrid에서 선택한 행의 배경색을 제어하려고했습니다. 그냥하지 않을 것입니다. 필자의 경우 데이터 그리드에 CellStyle이 있고 CellStyle이 내가 설정 한 RowStyle을 대체했기 때문입니다. 흥미롭게도 CellStyle은 배경색을 설정하지 않았기 때문에 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 트리거는 Background, Foreground & BorderBrush의 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, 게임 후반에이 답변을 크게 변경하지 않고 자신 만의 답변을 추가해야합니다.
Michael Petrotta

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>

그리고 내부에 레이블이있는 템플릿 열을 사용했기 때문에 RelativeSource 바인딩을 사용하여 Foreground 속성을 컨테이너 Foreground에 바인딩했습니다.

<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

나는이 문제로 하루를 더 잘 보냈다. 내가 설정 한 DataGrid의 RowBackground 속성이 속성을 변경하려는 모든 시도를 무시하고있었습니다. 삭제하자마자 모든 것이 작동했습니다. (DataGridTextColumn에서 설정된 전경과 동일).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.