web-dev-qa-db-ja.com

DataGridで選択した行の色を設定するにはどうすればよいですか

これは簡単なように思えますが、どうすればいいかわかりません。

DataGridで選択した行のデフォルトの背景色は非常に暗いため、読み込めません。それをオーバーライドする方法はありますか?

これを試しました(Nevermindsリンクから変更)

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

しかし、まだ何も...

119
Jan Bannister

とった。 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>
93
Jan Bannister

上記のソリューションでは、私の場合、各セルの周りに青い境界線が残っていました。

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

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

@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は、ListBoxItemsなどの他のコレクションアイテムでも機能します(たとえば、TargetType="{x:Type DataGridRow}"TargetType="{x:Type ListBoxItem}"に置き換えた場合)。

70
Sheridan

私はこの問題を抱えていたので、髪を切り裂きそうになりましたが、ネット上で適切な答えを見つけることができませんでした。 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>

誰かが同じ問題を抱えている場合に備えて、これを投稿してください。

18
J S

デフォルトの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>
12
grantnz

行選択イベントが機能しないのを経験した理由の一部

  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>
9
Anupam Dutta

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>
5
Kenneth Zhang

私はこの問題をいじる一日の大半を過ごしました。私が設定したDataGridのRowBackgroundプロパティは、変更しようとするすべての試みをオーバーライドしていました。削除するとすぐに、すべてが機能しました。 (ちなみに、DataGridTextColumnで設定されたForegroundも同様です)。

2
user947737