如何关闭DrawingBrush的抗锯齿?

时间:2011-05-07 13:34:45

标签: wpf

我想画一个三角形作为边框背景。一种方法是使用DrawingBrush,但是在较小的尺寸下,抗锯齿会扭曲三角形并使其变得模糊。 如何禁用消除锯齿?

<Border>
    <Border.Background>
        <DrawingBrush>
            <DrawingBrush.Drawing>
                <GeometryDrawing Brush="Red">
                    <GeometryDrawing.Geometry>
                        <PathGeometry>
                            <PathGeometry.Figures>
                                <PathFigureCollection>
                                    <PathFigure IsClosed="True" StartPoint="0,3" IsFilled="True">
                                        <PathFigure.Segments>
                                            <LineSegment Point="3,0" />
                                            <LineSegment Point="6,3" />
                                        </PathFigure.Segments>
                                    </PathFigure>
                                </PathFigureCollection>
                            </PathGeometry.Figures>
                        </PathGeometry>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Border.Background>
</Border>

我已尝试在所有可能的元素上设置RenderOptions.EdgeMode =“Aliased”和SnapsToDevicePixels =“true”,但这没有用...

修改
这是Width = 17时绘制的三角形的样子;高度= 12(缩放到800%):

Blurry triangle

正如您所看到的,边缘是消除锯齿的。禁用抗锯齿的所有常用选项似乎都不起作用......

3 个答案:

答案 0 :(得分:2)

我对此也非常沮丧。经过一些研究,我找到了答案:使用Visual Brush将可视化集中的Image元素设置为SnapToDevicePixels = true和Aliased Edge Mode。请参阅以下示例:

            <Canvas VerticalAlignment="Top" Height="12" Margin="0,24,0,0">
                <Canvas.Background>
                    <VisualBrush  TileMode="Tile"  Stretch="None" Viewport="-5,0,10,10" ViewportUnits="Absolute">
                        <VisualBrush.Visual>
                            <Image Stretch="None" RenderOptions.EdgeMode="Aliased" SnapsToDevicePixels="True">
                                <Image.Source>
                                    <DrawingImage>
                                        <DrawingImage.Drawing>
                                            <GeometryDrawing>
                                                <GeometryDrawing.Pen>
                                                    <Pen Brush="#8F8E8F" Thickness="1" />
                                                </GeometryDrawing.Pen>
                                                <GeometryDrawing.Geometry>
                                                    <LineGeometry StartPoint="0,0" EndPoint="0,10"/>
                                                </GeometryDrawing.Geometry>
                                            </GeometryDrawing>
                                        </DrawingImage.Drawing>
                                    </DrawingImage>
                                </Image.Source>
                            </Image>
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Canvas.Background>
            </Canvas>

答案 1 :(得分:1)

考虑到没有更多的回复,似乎答案是 - 这是不可能的。

答案 2 :(得分:0)

我认为您应该可以使用SnapToDevicePixels(虽然有时需要一些试验和错误)。你应该在拥有对象上设置它(所以不管放入什么边框)。你读过这篇文章了吗? http://msdn.microsoft.com/en-us/library/aa970908.aspx