我正在开发一个程序,我使用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
中来设置模板。这不起作用,因为它弄乱了行格式,尽管文本居中。
答案 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}}"
)。
此致