WPF Datagrid 样式选定的行
Posted
技术标签:
【中文标题】WPF Datagrid 样式选定的行【英文标题】:WPF Datagrid Style Selected Row 【发布时间】:2013-03-10 14:32:36 【问题描述】:我有一个 wpf 4.5 应用程序,它在用户控件中有一个数据网格。我在 Blend 中为数据网格设计了样式,但是当我将样式复制到我的 VS 2012 项目中时,它无法正常工作。
这是 Blend 中基本样式的样子:
请注意所选行中文本的颜色(绿色)以及正在编辑的文本框周围的填充
现在这是 Visual Studio 2012 的相同样式:
因此,所选行中突出显示的文本与背景颜色相同(使其不可见),我无法更改文本框的边框颜色或边距以匹配混合样式。
这是单元格样式:
<Style TargetType="x:Type DataGridCell">
<Setter Property="FocusVisualStyle" Value="x:Null" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type DataGridCell">
<Border x:Name="border"
BorderBrush="Transparent"
BorderThickness="1"
Background="Transparent"
SnapsToDevicePixels="True"
Margin="15,10,15,10">
<ContentPresenter Name="CellContent" SnapsToDevicePixels="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="Green"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="BorderBrush" TargetName="border" Value="#FFD8D8D8"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
因此您可以看到将绿色标记为前景色的触发器在混合中有效,但在视觉工作室中无效。我认为这是一种系统颜色,它以某种方式覆盖了触发器,但我不确定如何追踪它。
有人可以通过设置选定的行文本颜色和文本框边框/边距来帮助我纠正这个样式问题。
This is a link to the entire datagrid style resource dictionary
提前致谢
【问题讨论】:
指向数据网格样式的链接已失效。可以更新吗? 【参考方案1】:您好,我尝试了您的样式,在我的机器上,前景色变为绿色... 但是,如果它在您的 DevEnvironment 中不起作用,您可以尝试覆盖所选行文本的 SystemColor!
将此添加到您的样式中并删除触发器
<SolidColorBrush x:Key="x:Static SystemColors.HighlightTextBrushKey" Color="Green" />
【讨论】:
谢谢,我已经在这里工作了好几个小时,分别添加和删除样式和资源字典,看看是否有任何冲突。我采纳了您的想法并在 Visual Studio 中创建了一个新的 WPF 项目,并且该样式在新项目中完美运行。因此,我一次将当前项目中的所有样式资源添加到新项目中,以查看是否发生冲突或更改。没有!即使将所有样式作为资源包含在内,该样式仍然适用于新项目。有没有办法窥探 wpf 应用程序以准确查看元素应用了哪些样式? 我已经尝试过 snoop 程序,但找不到告诉我正在应用什么样式的地方。它只是告诉我元素属性的值【参考方案2】:原来是DataGridCell风格的冲突。我对所有数据网格单元格应用了没有键名的 DataGridCell 样式。然后我根据上面提到的那个创建了另一种单元格样式但是由于某种原因,如果我尝试将此单元格样式应用于数据网格中的特定列声明,则样式会中断。所以我不得不删除“基于样式”并找到另一种方法来进行特定于列的格式化。
编辑: 看这里的风格,太长了,不能发DataGridStyle
【讨论】:
JKing,最后的模板是什么?谢谢!以上是关于WPF Datagrid 样式选定的行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WPF C# 中的 DataGrid 的 TextBoxes 中获取选定的行值