【问题标题】:Change the color of the selected row in XAML更改 XAML 中选定行的颜色
【发布时间】:2018-09-24 17:13:26
【问题描述】:

我是 XAML 的新手,因此请原谅我这个基本问题。 基本上我正在尝试更改 DataGrid 中选定行的颜色。当前选择该行时,颜色为默认情况下是浅蓝色,但我不明白颜色的设置位置。 我想更改所选颜色以及所选行的文本颜色。 下面是我的代码。

        <DataGrid Name="TransferCallDataGrid"
              Margin="0 10 0 0"
              IsReadOnly="True"
              ItemsSource="{Binding Agents}" 
              SelectedItem="{Binding SelectedAgent}"
              AutoGenerateColumns="False" 
              HeadersVisibility="Column" 
              HorizontalAlignment="Stretch" 
              HorizontalGridLinesBrush="LightGray" 
              VerticalGridLinesBrush="Transparent" 
              HorizontalScrollBarVisibility="Disabled" 
              CanUserAddRows="False" 
              CanUserSortColumns="False"
              CanUserReorderColumns="False"
              BorderBrush="Transparent" 
              SelectionUnit="FullRow" 

              RowStyle="{DynamicResource DataGridRowStyle1}" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}">
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="ID" Width=".7*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="2"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Rectangle Grid.Column="0" Fill="{Binding Path=AgentState, Converter={StaticResource AgentStateConverterResource}}" Width="3" Margin="0" HorizontalAlignment="Left"/>
                                    <TextBlock Grid.Column="1" TextAlignment="Center" Text="{Binding Id}" Style="{DynamicResource GridTextColumnStyle}"/>
                                </Grid>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="First Name" Width="*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock TextAlignment="Center" Text="{Binding FirstName}" Style="{DynamicResource GridTextColumnStyle}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Last Name" Width="*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock TextAlignment="Center" Text="{Binding LastName}" Style="{DynamicResource GridTextColumnStyle}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="State" Width="1.1*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock TextAlignment="Center" Text="{Binding Path=AgentState, Converter={StaticResource AgentStateTextConverterResource}}" Style="{DynamicResource GridTextColumnStyle}" Foreground="{Binding Path=AgentState, Converter={StaticResource AgentStateConverterResource}}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

以下是我相信的行的样式

  <Style x:Key="DataGridRowStyle1" TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
        <Setter Property="ValidationErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Border x:Name="DGR_Border" BorderBrush="Transparent" BorderThickness="0" Background="White" SnapsToDevicePixels="True">
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <SelectiveScrollingGrid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </SelectiveScrollingGrid.RowDefinitions>
                            <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                            <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsNewItem" Value="True">
                <Setter Property="Margin" Value="{Binding NewItemMargin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
            </Trigger>

        </Style.Triggers>

    </Style>

任何帮助将不胜感激。

TIA。

----------编辑------ ---------------------------------

这是编辑后的代码块。 我现在可以更改背景颜色,但无法更改前景色。我的代码如下。

<USD:DynamicsBaseHostedControl.Resources>
    <demo:AgentStateConverter x:Key="AgentStateConverterResource"/>
    <demo:AgentStateTextConverter x:Key="AgentStateTextConverterResource"/>

    <Style x:Key="GridTextColumnStyle" TargetType="{x:Type TextBlock}">
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="Foreground" Value="#FF686767"/>
        <Setter Property="TextWrapping" Value="NoWrap"/>
        <Setter Property="TextTrimming" Value="None"/>
        <Setter Property="FontFamily" Value="Segoe UI Semibold"/>
    </Style>


    <Style x:Key="DataGridRowStyle1" TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>

        <Setter Property="ValidationErrorTemplate">

            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Border x:Name="DGR_Border" BorderBrush="Transparent" BorderThickness="0" Background="White" SnapsToDevicePixels="True">
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <SelectiveScrollingGrid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </SelectiveScrollingGrid.RowDefinitions>
                            <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                            <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsNewItem" Value="True">
                <Setter Property="Margin" Value="{Binding NewItemMargin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
            </Trigger>

            <!--<Trigger Property="IsSelected" Value="True">
        <Setter Property="BorderBrush" Value="Blue" />
                <Setter Property="Background" Value="Black" />
                <Setter Property="Foreground" Value="Green"/>
            </Trigger>-->
        </Style.Triggers>
        <!--<Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" />
        </Style.Resources>-->
    </Style>

    <Style TargetType="DataGridCell">


            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Yellow" />
                    <Setter Property="Background" Value="#022648" />
                </Trigger>

            </Style.Triggers>

    </Style>

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    我在这里发布了所有适用于前景色的代码。 也许您有其他样式干扰单元格前景... (这是一个非常快速和肮脏的例子,但是如果选中,文本颜色是黄色的)

    <Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.Resources>
            <Style TargetType="DataGridCell">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Foreground" Value="Yellow" />
                    </Trigger>
                </Style.Triggers>
            </Style>
            <Style x:Key="DataGridRowStyle1" TargetType="{x:Type DataGridRow}">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
                <Setter Property="SnapsToDevicePixels" Value="True"/>
                <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
                <Setter Property="ValidationErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridRow}">
                            <Border x:Name="DGR_Border" BorderBrush="Transparent" BorderThickness="0" Background="White" SnapsToDevicePixels="True">
                                <SelectiveScrollingGrid>
                                    <SelectiveScrollingGrid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </SelectiveScrollingGrid.ColumnDefinitions>
                                    <SelectiveScrollingGrid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                    </SelectiveScrollingGrid.RowDefinitions>
                                    <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                    <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                </SelectiveScrollingGrid>
                            </Border>
    
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <Trigger Property="IsNewItem" Value="True">
                        <Setter Property="Margin" Value="{Binding NewItemMargin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                    </Trigger>
                    <Trigger Property="IsSelected"
                             Value="True">
                        <Setter Property="BorderBrush"
                                Value="Red" />
                        <Setter Property="BorderThickness"
                                Value="2" />
                    </Trigger>
    
                </Style.Triggers>
    
            </Style>
            <XmlDataProvider x:Key="Employees" XPath="/Employees/*">
                <x:XData>
                    <Employees xmlns="">
                        <Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />
                        <Employee Name="Claire O&apos;Donnell" Type="FTE" EmployeeNumber="12345" />
                        <Employee Name="Palle Peterson" Type="FTE" EmployeeNumber="5678" />
                        <Employee Name="Amy E. Alberts" Type="CSG" EmployeeNumber="99222" />
                        <Employee Name="Stefan Hesse" Type="Vendor" EmployeeNumber="-" />
                    </Employees>
                </x:XData>
            </XmlDataProvider>
        </Grid.Resources>
        <DataGrid Name="TransferCallDataGrid"
              Margin="0 10 0 0"
              IsReadOnly="True"
              ItemsSource="{Binding Source={StaticResource Employees}}" 
              SelectedItem="{Binding SelectedAgent}"
              AutoGenerateColumns="False" 
              HeadersVisibility="Column" 
              HorizontalAlignment="Stretch" 
              HorizontalGridLinesBrush="LightGray" 
              VerticalGridLinesBrush="Transparent" 
              HorizontalScrollBarVisibility="Disabled" 
              CanUserAddRows="False" 
              CanUserSortColumns="False"
              CanUserReorderColumns="False"
              BorderBrush="Transparent" 
              SelectionUnit="FullRow" 
    
              RowStyle="{DynamicResource DataGridRowStyle1}" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="ID" Width=".7*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="2"/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <Rectangle Grid.Column="0"  Width="3" Margin="0" HorizontalAlignment="Left"/>
                                <TextBlock Grid.Column="1" TextAlignment="Center" Text="{Binding Id}" />
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    
                <DataGridTemplateColumn Header="First Name" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock TextAlignment="Center" Text="{Binding}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    
                <DataGridTemplateColumn Header="Last Name" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock TextAlignment="Center" Text="{Binding}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
    
                <DataGridTemplateColumn Header="State" Width="1.1*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock TextAlignment="Center" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    

    【讨论】:

    • 请检查我编辑的问题,我已经粘贴了我正在使用的代码。
    • 仍然无法更改前景/字体颜色
    • 有没有其他方法可以改变你之前显示的字体颜色
    • x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
    • 我已经弄清楚了.. GridTextColumnStyle 覆盖了它,但如果我绕过它,它工作正常。但是,我想在未选择行并且选择行时应用 GridTextColumnStyle 的样式,我只想将颜色更改为白色。我怎样才能做到这一点
    【解决方案2】:

    您可以在 DataGridCell 样式中执行此操作:

    <Style TargetType="DataGridCell">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Yellow" />
                    </Trigger>
                </Style.Triggers>
            </Style>
    

    要回答您的问题,默认颜色来自何处: 它来自 System.Colors.HighlightBrushKey。

    您可以覆盖它,这将是另一种解决方案。将此添加到您的资源中:

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

    【讨论】:

    • 非常感谢您的帮助。我有 2 个问题。 1. 为什么选择 TargetType="DataGridCell" 为什么不选择 TargetType="DataGridRow",因为在这种情况下我试图更改行的颜色。 2. 我想在选择行时更改字体的文本颜色,但我只想用三列即 ID、FirstName 和 LastName 来完成,我希望第 4 列的字体颜色保持原样。我怎样才能做到这一点?
    • 对 Q1 的回答:DataGridCell 样式似乎覆盖了 DataGridRow 样式
    • 回答Q2:在DataGridCell样式中,设置Foreground属性:
    • 您是如何发现 DataGridCell 覆盖 DataGridRow 的?
    • 正如我所说,我想更改 3 列的前景属性,但第四列将保持原样
    猜你喜欢
    • 2018-04-12
    • 2021-02-03
    • 2017-03-23
    • 1970-01-01
    • 2018-01-01
    • 2023-04-07
    • 2015-12-26
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多