在Silverlight中,使用XAML剪贴画的正确方法是什么?

时间:2011-02-24 21:28:56

标签: silverlight xaml

假设我在XAML中为我的Silverlight应用程序构建了一些剪贴画,或者从http://www.xamalot.com下载了它,在我的应用程序中使用它的最佳方法是什么?

最好为每件艺术品创建一个用户控件吗?或者有更好的方法可以从资源字典中引用它吗?

更新

提供的答案非常详细,似乎暗示使用它的目的远大于我想象的目的。我真的只是想知道消费XAML剪贴画的最佳方式,用作(比如)工具栏上的按钮。

2 个答案:

答案 0 :(得分: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即可。然而,最大的缺点是所有这些图像Xamls都在应用程序启动时被解析和加载,这可能是不可取的。

另一方面,您可能拥有一个分类Xaml剪贴画的大型库。在这种情况下,您需要将它们放在文件夹结构中,并为每个文件夹包含一个标准大小的缩略图png。一个Xml文件,用作目录,然后根据需要按需加载Xaml文件。在这种情况下,您可以从文件中删除ResourceDictionary并将ControlTemplate作为根元素,使用XamlReader加载模板,然后将模板缓存在您自己的字典中(可能作为目录实施)。

答案 1 :(得分:2)

您可以将XAML剪贴画对象作为XML存储在数据库中,然后通过Web服务按需下载它们。一旦下载的XAML出现在您的客户端中,您就可以执行以下操作:

string myDownloadedXaml; // downloaded from the server
Grid myGrid; // the container in your view
myGrid.Children.Add(XamlReader.Load(myDownloadedXaml));