在Silverlight中,如何正确地使用XAML剪贴画?

4
假设我已经在XAML中为我的Silverlight应用程序构建了一些剪贴画,或者从http://www.xamalot.com下载了它,那么最好的使用方式是什么?
创建每个艺术品的用户控件是最好的方法吗?还是有更好的方式可以从资源字典中引用它?
更新:
提供的答案非常详细,似乎暗示着将其用于比我想象的要大得多的目的。 我真的只是想知道将XAML剪贴画用作(例如)工具栏上按钮的最佳方法。
2个回答

6

有更好的方法。

对于每个片段,您将拥有一个单独的文件,但不是站点使用的包装器,直接在资源字典中使用Canvas实例不是最佳选择。我们将从一个ResourceDictionary开始,但使其看起来像这样:-

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:YourApplication">
    <ControlTemplate TargetType="local:XamlImage" x:Key="SomeImage">
        <Viewbox>
            <Canvas> <!-- this the toplevel canvas from the site or your design -->
            </Canvas>
        </Viewbox>
    </ControlTemplate>
</ResourceDictionary>

这里有两个作用,首先使用ControlTemplate来包含图像,这是一种更有效的存储方式,当图像被多次使用时(例如用作图标)。

其次,它使用了Viewbox,实现了矢量图形的承诺,它允许将图像缩放到指定的大小。

您需要向项目添加一个新的Templated Custom Control,并将其命名为XamlImage。您不需要对其进行任何操作,只需存在即可。

暂时先将此资源字典添加到App.Xaml中(这可能不是它最终所在的位置)。

现在,您可以使用以下方式在页面中放置此图像:

<local:XamlImage Template="{StaticResource contactnew}"  />

现在有几种不同的方法,具体取决于您的真实意图和数量,情况过于复杂,我无法详尽评论。因此,我们来看两个极端情况...
如果您只想从中挑选出几张图片,那么您可以创建更多的文件,并将它们添加到app.xaml的MergedDictionaries中。然而,这样做的一个很大的缺点是,在应用程序启动时需要解析和加载所有这些图像Xaml,这可能不是理想的选择。
另一方面,您可能拥有一个大型分类的Xaml剪贴画库。在这种情况下,您需要将它们放在文件夹结构中,并为每个剪贴画包含一个标准大小的缩略图png。还需要一个Xml文件作为目录,然后按需加载所需的Xaml文件。在这种情况下,您可以放弃文件中的ResourceDictionary,并将ControlTemplate作为根元素使用XamlReader加载模板,然后将模板缓存到自己的字典中(可能作为目录实现的一部分)。

也许我有点愚钝:contactnew 是从哪里来的?你关于如何将图像放置在页面中的示例不容易理解。 - Killnine

2
您可以将XAML剪贴画对象作为XML存储在数据库中,然后通过Web服务按需下载它们。一旦客户端下载了XAML,您可以执行以下操作:
string myDownloadedXaml; // downloaded from the server
Grid myGrid; // the container in your view
myGrid.Children.Add(XamlReader.Load(myDownloadedXaml));

+1 正确。也许当您需要多次使用生成器元素时,可以将其存储在资源中,这样就不需要多次解析它。 - Luc Bos
你需要将Load的结果转换为UIElement - AnthonyWJones
@Luc:这是个好主意,但要做到这一点,下载的Xaml的结果需要是一个“DataTemplate”。然后可以使用“DataTemplate”的“LoadContent”方法构建多个图像实例。 - AnthonyWJones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接