WPF在WPF中将SVG文件用作图标的正确方法是什么

时间:2010-08-19 21:23:26

标签: wpf svg

有人可以描述推荐的逐步程序吗?

编辑:

步骤1。将SVG转换为XAML ......很容易

第二步。现在怎么样?

7 个答案:

答案 0 :(得分:118)

您的技术将取决于您的SVG到XAML转换器产生的XAML对象。它会产生绘图吗?一个图像?一个网格?帆布?一条路径?几何?在每种情况下,您的技术都会有所不同。

在下面的示例中,我假设您在按钮上使用了您的图标,这是最常见的情况,但请注意,相同的技术适用于任何ContentControl。

使用绘图作为图标

要使用绘图,请使用DrawingBrush绘制一个大小合适的矩形:

<Button>
  <Rectangle Width="100" Height="100">
    <Rectangle.Fill>
      <DrawingBrush>
        <DrawingBrush.Drawing>

          <Drawing ... /> <!-- Converted from SVG -->

        </DrawingBrush.Drawing>
      </DrawingBrush>
    </Rectangle.Fill>
  </Rectangle>
</Button>

将图片用作图标

可以直接使用图像:

<Button>
  <Image ... />  <!-- Converted from SVG -->
</Button>

将网格用作图标

可以直接使用网格:

<Button>
  <Grid ... />  <!-- Converted from SVG -->
</Button>

如果您需要控制尺寸,可以将其包含在Viewbox中:

<Button>
  <Viewbox ...>
    <Grid ... />  <!-- Converted from SVG -->
  </Viewbox>
</Button>

将画布用作图标

这就像使用图像或网格一样,但由于画布没有固定的大小,您需要指定高度和宽度(除非这些已经由SVG转换器设置):

<Button>
  <Canvas Height="100" Width="100">  <!-- Converted from SVG, with additions -->
  </Canvas>
</Button>

将路径用作图标

您可以使用路径,但必须明确设置笔触或填充:

<Button>
  <Path Stroke="Red" Data="..." /> <!-- Converted from SVG, with additions -->
</Button>

<Button>
  <Path Fill="Blue" Data="..." /> <!-- Converted from SVG, with additions -->
</Button>

将几何图形用作图标

您可以使用路径绘制几何体。如果它应该被抚摸,请设置描边:

<Button>
  <Path Stroke="Red" Width="100" Height="100">
    <Path.Data>
      <Geometry ... /> <!-- Converted from SVG -->
    </Path.Data>
  </Path>
</Button>

或如果应填写,请设置填充:

<Button>
  <Path Fill="Blue" Width="100" Height="100">
    <Path.Data>
      <Geometry ... /> <!-- Converted from SVG -->
    </Path.Data>
  </Path>
</Button>

如何绑定数据

如果你正在做SVG - &gt;代码中的XAML转换并希望使用数据绑定显示生成的XAML,请使用以下方法之一:

绑定绘图:

<Button>
  <Rectangle Width="100" Height="100">
    <Rectangle.Fill>
      <DrawingBrush Drawing="{Binding Drawing, Source={StaticResource ...}}" />
    </Rectangle.Fill>
  </Rectangle>
</Button>

绑定图像:

<Button Content="{Binding Image}" />

绑定网格:

<Button Content="{Binding Grid}" />

在视箱中绑定网格:

<Button>
  <Viewbox ...>
    <ContentPresenter Content="{Binding Grid}" />
  </Viewbox>
</Button>

绑定画布:

<Button>
  <ContentPresenter Height="100" Width="100" Content="{Binding Canvas}" />
</Button>

绑定路径:

<Button Content="{Binding Path}" />  <!-- Fill or stroke must be set in code unless set by the SVG converter -->

绑定几何:

<Button>
  <Path Width="100" Height="100" Data="{Binding Geometry}" />
</Button>

答案 1 :(得分:36)

我找到了在WPF中使用svg图标的最佳方法。我使用sharpvector框架:

Install-Package SharpVectors

所以我的XAML如下:

<UserControl ...
         xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
         ...>
    ...
    <svgc:SvgViewbox Margin="5" Height="20" Width="20" Stretch="Uniform" Source="/View/Resources/Icons/Connection.Closed.Black.svg"/>
    ...
</UserControl>

答案 2 :(得分:5)

Windows 10 Creators Update(15063)本身支持SVG图像,但有一些问题。

使用就像将Source的{​​{1}}设置为SVG的路径一样简单。这相当于使用<Image />,如下所示:

SvgImageSource

但是,SVG图像以这种方式加载(通过XAML)may load jagged/aliased。一种解决方法是指定<Image> <Image.Source> <SvgImageSource UriSource="Assets/svg/icon.svg" /> </Image.Source> </Image> RasterizePixelHeight值为双倍+实际高度/宽度:

RasterizePixelWidth

这可以通过在基本图片的<SvgImageSource RasterizePixelHeight="300" RasterizePixelWidth="300" UriSource="Assets/svg/icon.svg" /> <!-- presuming actual height or width is under 150 --> 事件中创建新的SvgImageSource来动态解决:

ImageOpened

在非高dpi屏幕上可能很难看到别名,但这是试图说明它。

这是上述代码的结果:使用初始var svgSource = new SvgImageSource(new Uri("ms-appx://" + Icon)); PrayerIcon.ImageOpened += (s, e) => { var newSource = new SvgImageSource(svgSource.UriSource); newSource.RasterizePixelHeight = PrayerIcon.DesiredSize.Height * 2; newSource.RasterizePixelWidth = PrayerIcon.DesiredSize.Width * 2; PrayerIcon2.Source = newSource; }; PrayerIcon.Source = svgSource; 的{​​{1}},以及使用Image中创建的SvgImageSource的第二个SvgImageSource事件:

enter image description here

这是顶部图片的放大视图:

enter image description here

虽然这是底部(抗锯齿,正确)图像的放大视图:

enter image description here

(您需要在新标签页中打开图片并以全尺寸查看,以了解差异)

答案 3 :(得分:3)

您可以将SVG中生成的xaml用作矩形上的绘图画笔。像这样:

<Rectangle>
   <Rectangle.Fill>
      --- insert the converted xaml's geometry here ---
   </Rectangle.Fill>
</Rectangle>

答案 4 :(得分:1)

另一个替代方法是dotnetprojects SVGImage

这允许直接在xaml中本地使用.svg文件。

最令人高兴的是,它只是一个大约100k的组件。与Sharpvector相比,Sharpvector的文件要大得多。

用法:

...
xmlns:svg1="clr-namespace:SVGImage.SVG;assembly=DotNetProjects.SVGImage"
...
<svg1:SVGImage Name="mySVGImage" Source="/MyDemoApp;component/Resources/MyImage.svg"/>
...

仅此而已。

请参阅:

答案 5 :(得分:0)

使用SvgImage或SvgImageConverter扩展,SvgImageConverter支持绑定。 有关演示这两个扩展的示例,请参见下面的链接。

https://github.com/ElinamLLC/SharpVectors/tree/master/TutorialSamples/ControlSamplesWpf

答案 6 :(得分:0)

我们可以直接使用SVG代码中的路径代码:

    <Path>
        <Path.Data>
            <PathGeometry Figures="M52.8,105l-1.9,4.1c ...