C# 如何防止WPF裁剪矢量图形?

C# 如何防止WPF裁剪矢量图形?,c#,wpf,svg,C#,Wpf,Svg,我有一个SVG图形,它是一个位于400x400视口中心的264x264正方形,正方形周围68个像素的填充是图像的一个重要部分,我希望它在WPF中显示出来。我正在使用一个库将SVG图形转换为WPF DrawingImage,在我将其填充到一个页面进行预览后,输出如下所示: <Page x:Class="Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://sch

我有一个SVG图形,它是一个位于400x400视口中心的264x264正方形,正方形周围68个像素的填充是图像的一个重要部分,我希望它在WPF中显示出来。我正在使用一个库将SVG图形转换为WPF DrawingImage,在我将其填充到一个页面进行预览后,输出如下所示:

<Page x:Class="Page1"
  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" 
  mc:Ignorable="d" 
  d:DesignHeight="400" d:DesignWidth="400"
Title="Page1">

<Image>
    <Image.Source>
        <DrawingImage>
            <DrawingImage.Drawing>
                <DrawingGroup xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:svg="http://sharpvectors.codeplex.com/runtime/">
                    <DrawingGroup.Children>
                        <DrawingGroup>
                            <DrawingGroup.Children>
                                <DrawingGroup>
                                    <DrawingGroup.Children>
                                        <DrawingGroup>
                                            <DrawingGroup.Children>
                                                <GeometryDrawing Brush="#FFAAFFAA">
                                                    <GeometryDrawing.Pen>
                                                        <Pen Brush="#FF000000" Thickness="10" StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" />
                                                    </GeometryDrawing.Pen>
                                                    <GeometryDrawing.Geometry>
                                                        <RectangleGeometry RadiusX="0" RadiusY="0" Rect="68,68,264,264" />
                                                    </GeometryDrawing.Geometry>
                                                </GeometryDrawing>
                                            </DrawingGroup.Children>
                                            <DrawingGroup.ClipGeometry>
                                                <RectangleGeometry Rect="0,0,400,400" />
                                            </DrawingGroup.ClipGeometry>
                                            <DrawingGroup.Transform>
                                                <TranslateTransform X="0" Y="0" />
                                            </DrawingGroup.Transform>
                                        </DrawingGroup>
                                    </DrawingGroup.Children>
                                </DrawingGroup>
                            </DrawingGroup.Children>
                            <DrawingGroup.ClipGeometry>
                                <RectangleGeometry Rect="0,0,400,400" />
                            </DrawingGroup.ClipGeometry>
                        </DrawingGroup>
                    </DrawingGroup.Children>
                </DrawingGroup>
            </DrawingImage.Drawing>
        </DrawingImage>
    </Image.Source>
</Image>
</Page>
生成的图像是一个完全填满其容器的正方形,而不是像我所希望的那样在其周围留下一些空白。如何让WPF保留该空间而不是将其裁剪掉?

使用DrawingImage时,渲染图像时会忽略/裁剪空白。这篇文章讨论了同样的问题:

您可以通过在绿色矩形后面将空白区域绘制为一个透明的400x400矩形来实现所需:

...
<DrawingGroup>
    <DrawingGroup.Children>

        <!-- Added transparent "spacer": -->
        <GeometryDrawing Brush="Transparent">
            <GeometryDrawing.Geometry>
                <RectangleGeometry RadiusX="0" RadiusY="0" Rect="0,0,400,400" />
            </GeometryDrawing.Geometry>
        </GeometryDrawing>

        <!-- This was here before: -->
        <GeometryDrawing Brush="#FFAAFFAA">
            <GeometryDrawing.Pen>
                <Pen Brush="#FF000000" Thickness="10" 
                     StartLineCap="Flat" EndLineCap="Flat" LineJoin="Miter" />
            </GeometryDrawing.Pen>
            <GeometryDrawing.Geometry>
                <RectangleGeometry RadiusX="0" RadiusY="0" Rect="68,68,264,264" />
            </GeometryDrawing.Geometry>
        </GeometryDrawing>
        ...

工作起来很有魅力!对于使用相同转换库SharpVectors(新BSD许可证)的用户,修改其输出为您创建这些透明矩形相当简单。假设sharpvectors-24484.zip是您的源包,则在第140行WpfSvgRendering.cs中开始的if语句中,对于每个drawGroup.ClipGeometry=new RectangleGeometry[某个矩形实例];添加一个_drawGroup.Children.Insert0,new GeometryDrawing{Brush=Brush.Transparent,Geometry=new RectangleGeometry[some Rectangle instance]};在下一行