【发布时间】:2018-02-28 09:05:44
【问题描述】:
此问题旨在成为有关如何使用通过 Inkscape 创建并保存为 XAML 的图像的最佳实践。
互联网上有很多文章,但没有多少文章展示了每种解决方案的优缺点。 Example 1, Example 2
当您使用 Inkscape 创建图像并另存为 XAML 时,您在 XAML 中只会有一个 Viewbox。
<?xml version="1.0" encoding="UTF-8"?>
<!--This file is NOT compatible with Silverlight-->
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stretch="Uniform">
<Canvas Name="svg8" Width="210" Height="297">
<Canvas.RenderTransform>
<TranslateTransform X="0" Y="0"/>
</Canvas.RenderTransform>
<Canvas.Resources/>
<!--Unknown tag: sodipodi:namedview-->
<!--Unknown tag: metadata-->
<Canvas Name="layer1">
<Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Canvas.Left="55.184521" Canvas.Top="113.30357" Width="33.261906" Height="33.261906" Name="rect4485" Fill="#FFFFFFFF" StrokeThickness="5.29166651" Stroke="#FF000000" StrokeMiterLimit="4"/>
</Canvas>
</Canvas>
</Viewbox>
要使用此文件,我通常必须将其包装在 ResourceDictionary 中。这很烦人,因为我无法再在 Inkscape 中编辑文件,而无需删除 ResourceDictionary。
图像将多次显示,例如在ListViewItem 或任何其他具有ItemsSource 的元素中。
有没有办法让我只有一个 ResourceDictionary 可以导入所有这些 XAML 文件?
假设我已将其包装在 ResourceDictionary 中,并为 Viewbox 赋予了 x:Key="SquareIcon" 值。
展示这个元素最节省资源的方式是什么?
我是否应该使用ContentPresenter 并设置其Content 属性并设置Canvas x:Shared="false"?
使用Label(或其他控件)是否更有效?
也许删除Viewbox 并在我自己的视图中始终在Viewbox 中使用Canvas?
我应该将Viewbox 包装在ControlTemplate 中并在ContentPresenter Template 属性中使用它吗?这样我就不需要在Canvas 上使用x:Shared 属性。
【问题讨论】:
-
我发现使用通过 Inkscape 生成的矢量图形时,它会为图形对象中使用的画笔使用相同的名称。因此,即使您为每个图形对象创建单独的字典,在解析
MergedDictionaries时,名称也会在 xaml 中发生冲突。这只是仅供参考。您可能会创建一个包含所有图形对象的大型文件,然后将其作为 1 个文件导入。那么至少命名不会成为问题。