设置DataGrid行的背景颜色

时间:2016-01-29 00:32:05

标签: c# wpf xaml datagrid triggers

我正在开发一个程序,我使用GroupingGrid(如果需要,请包含在此帖子的底部。在此网格中,我建立了DataGrid,我正在创建一种Aero效果,用于匹配应用程序中的TreeView,它将被转换为分组网格(我们构建错误)。我希望文本垂直居中,所选行的背景为在活动时为蓝色渐变,在无效时为灰色渐变(例如当窗口失去焦点时)。最初,我只是在页面主题中定义了这些值:

<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" EndPoint="0,1" StartPoint="0,0">
    <GradientStop Color="#FFD9F4FF" Offset="0"/>
    <GradientStop Color="#FF9BDDFB" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="{x:Static SystemColors.ControlBrushKey}" EndPoint="0,1" StartPoint="0,0">
    <GradientStop Color="#FFEEEDED" Offset="0"/>
    <GradientStop Color="#FFDDDDDD" Offset="1"/>
</LinearGradientBrush>

HighlightBrushKey设置蓝色渐变,ControlBrushKey设置窗口未激活时的灰色渐变。

但是,我希望单元格中的文本居中,这是我完成的:

<controls:GroupingGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="VerticalAlignment" Value="Center" />
    </Style>
</controls:GroupingGrid.CellStyle>

但是,这会缩小单元格中的文本框,这是设置背景的位置,因此它在直接文本后面带有一条窄带蓝色,两侧带有一条白色带。为了解决这个问题,我将单元格高亮颜色设置为透明,并为网格行指定颜色,如:

<Style x:Key="PrettifyRow" TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
        </Trigger>
    </Style.Triggers>
</Style>

但是,现在的问题是,当窗口未激活时,我无法将背景设置为灰色渐变。我基于它的TreeView使用了这个:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsSelected" Value="True"/>
        <Condition Property="IsSelectionActive" Value="False"/>
    </MultiTrigger.Conditions>
    <Setter Property="BorderBrush" Value="LightGray"/>
</MultiTrigger>

DataGrid没有IsSelectionActive属性,因此我尝试使用IsFocused。不幸的是,这不起作用。我怎样才能让亮点与此类似?通过对此进行试验,我认为可以通过两种方式使其工作 - 要么找到一种不同的方式来垂直居中文本,要么使用事件以某种方式确定选择何时处于活动状态。如果它很重要,我不允许列自动填充 - 我手动说明要填充的列。

这是承诺的GroupingGrid

<DataGrid x:Class="Rubberduck.Controls.GroupingGrid"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Rubberduck.Controls"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <DataGrid.Resources>
        <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Expander Background="WhiteSmoke" Foreground="Black" Header="{Binding Name}" IsExpanded="True">
                            <ItemsPresenter></ItemsPresenter>
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.Resources>
    <DataGrid.GroupStyle>
        <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <DataGridRowsPresenter></DataGridRowsPresenter>
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

编辑:

我尝试通过将每个单元格包装在Grid中来设置模板。这不起作用,因为它弄乱了行格式,尽管文本居中。

1 个答案:

答案 0 :(得分:0)

尝试反转触发器,并在条件为false时设置原始画笔。

有些事情:

<Style x:Key="PrettifyRow" TargetType="{x:Type DataGridRow}">
<Style.Triggers>
    <Trigger Property="IsSelected" Value="True">
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" />
    </Trigger>
 <Trigger Property="IsSelected" Value="False">
        <Setter Property="Background" Value="{put here the original brush or set it to be transparent}" />
    </Trigger>
</Style.Triggers>

另外,当您重新设置某些控件样式时,使用BasedOn语法来保留原始样式(BasedOn="{StaticResource {x:Type DataGridRow}}")。

此致