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

回答:


155

上記の解決策では、私の場合、各セルの周りに青い境界線が残りました。

これは私のために働いたソリューションです。これは非常に簡単DataGridです。これをに追加するだけです。これSolidColorBrushを線形グラデーションなどの他のブラシに変更できます。

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

パーフェクト-まさに私が必要としたもの。DGの既存のスタイルを引き続き参照し、選択した行の背景ブラシを変更できるようにしました。
Gatmando、2011年

5
完全な。フォアグラウンドカラーに同じことをする方法について何か考えはありますか?
Arsen Zahray、2012年

8
Arsen、同じようにSystemColors.HighlightTextBrushKeyのブラシをオーバーライドして、テキストの色を設定します。
ベンマッキントッシュ2012

たとえば<DataGrid>ItemsSource="{Binding Path=MySelector}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}"、Databindingを使用して行全体を選択すると、行はLightGreyのみになります。SystemColorsもありますか?「
Rolfi

6
Focus:がない場合、最後に見つけましたSystemColors.ControlBrushKey
Rolfi 2013年

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
どのセクションに入れますか?
大佐パニック

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>

もちろん、好きな色を入力できます。これはStyleまた、のような他のコレクションアイテムのために動作しますListBoxItem(あなたが交換した場合、S TargetType="{x:Type DataGridRow}"TargetType="{x:Type ListBoxItem}"例えば)。


6
あなたの解決策は最高のものです。
開発者

いいね、シェリダン。選択した行の行の前景色も必要です。ただし、デフォルトのHighlightTextBrushKey(つまり黒)を取ります。何をすべきか?
デスレース2013

1
@ deathrace.dj、私があなたを正しく理解している場合は、私の例Colorの3番目のプロパティSolidColorbrushを好きな色に変更する必要があります。この宣言を使用すると、実際の色に設定されてSolidColorbrushいるSystemColors.HighlightTextBrushKey用途を。上記の設定を上書きする可能性があるためForeground、他のStyle場所で色を設定していないことに注意してくださいResources
シェリダン

ありがとう、これはまさに私が探していたものです!
Enrico

に透明なブラシを設定することもできます。そうしないとSystemColors.InactiveSelectionHighlightBrushKey、グリッドがフォーカスを失ったときに行が強調表示されます
dlf

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 14

1
私もこれに遭遇し、CellStyleも設定していません。これを行スタイルに設定しようとすると、非セル要素のみに影響しました。
BigSandwich 2014

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

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.