DataGrid样式 - 在后台添加可视图案

时间:2012-01-09 16:50:24

标签: wpf datagrid styles

我正在尝试在我拥有的DataGrid中添加一些样式。

我目前正在开发一个应用程序,旨在显示大量的财务数据(数字矩阵),其中包含许多可视化工具,用于检测良好数据,错误数据......并在需要时通过将它们与目标值进行比较来纠正它们

目前,我的颜色代码基本上是:

  • 白色背景:当前值很好
  • 红色背景:当前值低于目标值!
  • 绿色背景:当前值高于目标值!

我玩透明度来设置背景清晰,如果有点接近好的值,否则强。

现在我想添加另一种可视化工具:某种视觉模式,通知用户这个值虽然正确或错误,但存在潜在风险(正如我之前所说的那样是财务数据,因此,它主要测量的是亏损风险。)

当前的应用程序,在VBA中编程,使用一个技巧,向单元格添加一个空注释,因此角落上会出现一个小的红色三角形。

我想找到一种方法将其添加到我的XAML样式中,我想到的最好的方法是添加一个视觉模式。

这是我想要实现的一个例子:

Grid example

在左栏中,您可以看到"正常显示"。 在右边,我添加了"危险风格",这应该意味着"警告,这个值有问题"。 第一行显示了在Excel上执行此操作的旧方法:使用虚假注释,在右上角添加红色三角形。

您对如何实现这一目标有任何想法吗? Adorner可以做到这一点吗?

顺便说一下,网格是可编辑的,所以我显然不想放弃可编辑的方面,这让我怀疑可能Adorner ......

以下是当前XAML Style,其应用为CellStyle

<Style x:Key="DynamicCellStyle" TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="#FF316AC5" />
        </Trigger>
        <Trigger Property="IsSelected" Value="False">
            <Setter Property="Background">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource CellToColorConverter}">
                        <!-- Some bindings for the converter to compute the actual color -->
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>

    </Setter>

这里有什么想法吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

对于某些人来说,这可能有些神奇,但我作为解决方法做的一件事是使用VisualBrush或DrawingBrush作为背景。您可以使用红色,绿色,白色和橙色的一组可视刷,并将散列图案作为叠加层。你可以用DrawingBrushes做同样的事情。

或者,大声思考,你可以使用DrawingBrush作为颜色的不透明蒙版。这样你只需要一个带有哈希模式的画笔。

[查看我的WPF书后...]

最简单的可能是将SpreadMethod设置为Repeat的LinearGradientBrush。使用起始点和端点值进行播放以获得条带效果。以下是本书的一个例子:

<LinearGradientBrush StartPoint=".45,.45" EndPoint=".55,.55" SpreadMethod="Repeat">
<GradientStop Offset="0" Color="Blue"/>
<GradientStop Offset="1" Color="Red"/>
</LinearGradientBrush>

答案 1 :(得分:2)

好的,我找到了一种非常合适的方法,使用DrawingBrush

                                            <DrawingBrush TileMode="Tile"
                                                      ViewportUnits="RelativeToBoundingBox"
                                                      Viewport="0,0,0.20,1">
                                                <DrawingBrush.Drawing>
                                                    <DrawingGroup>
                                                        <GeometryDrawing>
                                                            <GeometryDrawing.Pen>
                                                                <Pen Brush="Red" Thickness="0.83"/>
                                                            </GeometryDrawing.Pen>
                                                            <GeometryDrawing.Geometry>
                                                                <RectangleGeometry Rect="0.3,0.4,0.3,0.21" RadiusX="0" RadiusY="0"/>
                                                            </GeometryDrawing.Geometry>
                                                        </GeometryDrawing>
                                                        <GeometryDrawing>
                                                            <GeometryDrawing.Pen>
                                                                <Pen Brush="Black" Thickness="0.05"/>
                                                            </GeometryDrawing.Pen>
                                                            <GeometryDrawing.Geometry>
                                                                <LineGeometry StartPoint="0,1" EndPoint="1,0" />
                                                            </GeometryDrawing.Geometry>
                                                        </GeometryDrawing>
                                                    </DrawingGroup>
                                                </DrawingBrush.Drawing>
                                            </DrawingBrush>

基本上你会绘制一个红色矩形(你可以改变当然的颜色),这将填充单元格,因此充当背景,并绘制5条对角线以上。 您可以通过在此处切换x号来在线更改数字:Viewport="0,0,x,1"。在我的情况下,0.20表示总表面的20%,例如Geometry将被绘制五次,每一次占据可用宽度的20%。

使用此画笔作为任何DataGridCell的背景,您将获得以下结果:

DataGrid templates

这几乎就是我想要的(并且比dex3703的GradientBrush想法更好一些)