如何从 XAML 为复合应用程序加载图像?

Posted

技术标签:

【中文标题】如何从 XAML 为复合应用程序加载图像?【英文标题】:How to load an image from XAML for a composite application? 【发布时间】:2011-04-05 20:08:03 【问题描述】:

我已经了解了如何在 Silverlight 中加载图像以及如何在 WPF 中加载图像,但我不知道如何为复合 Prism 应用的 Silverlight 和 WPF 风格使用相同的 XAML 加载图像.理想情况下,我想做这样的事情:

<Image Source="/Resources/Images/foo.png"/>

使用组件表示法的相对 URI 将不起作用,因为 Silverlight 和 WPF 程序集的命名不同(出于理智考虑)。我正在使用 Silverlight 4 和 .NET 4.0。

【问题讨论】:

也许只是跑题了,但我们只是进行了相同的命名健全性检查,他们在 Prism 示例中这样做的方式确实引起了共鸣:程序集具有相同的文件名,但是Silverlight 的 csproj 文件末尾附加了 .Silverlight。所以在解决方案资源管理器中,它的 MyProject.Silverlight,但程序集文件只是 MyProject.dll。这使您在设计时保持理智,但程序集名称相同。 (参见股票交易者 RI 示例) @JMarsch:我认为这是一个答案? @Anderson Imes -- 我会重新发布,所以你可以标记答案! 【参考方案1】:

您可以执行以下操作。在单独的资源字典中定义图像的 URI。然后 WPF 和 Silverlight 项目将定义它们自己的字典,这些字典将被 shell 项目引用。这是一个例子:

<BitmapImage x:Key="Foo">/Resources/Images/foo.png</BitmapImage>

-

<Image Source="StaticResource Foo"/>

【讨论】:

没有完美的解决方案,但这似乎平衡了工具支持(请参阅我的其他评论)和解决问题。谢谢!【参考方案2】:

(从我的评论中转贴作为答案)

我们刚刚进行了相同的命名健全性检查,他们在 Prism 示例中执行此操作的方式确实引起了共鸣:程序集具有相同的文件名,但 silverlight 的 csproj 文件在末尾附加了 .Silverlight。所以在解决方案资源管理器中,它的 MyProject.Silverlight,但程序集文件只是 MyProject.dll。这使您在设计时保持理智,但程序集名称相同。 (参见股票交易员 RI 示例)

【讨论】:

我真的很想使用这个解决方案,但是当您使用 ReSharper 之类的工具时它会崩溃:如果您在 XAML 中添加未引用的类型并使用 RS 添加引用,则太容易选择错误的程序集(当您需要 WPF 时选择 SL,反之亦然)。我认为在支持工具变得更好之前保留名称很重要。 啊——我没有使用 resharper,也没有考虑 XAML 角度。我猜从那里,他们是按程序集名称而不是项目名称来做的? 是的,它们按程序集名称而不是项目名称。我将在今天晚些时候提交一个错误,它们允许您从 Silverlight 项目中引用 WPF 程序集。它应该足够聪明,知道 IMO 的区别。【参考方案3】:

我在想一些类似于 Pavlo 的东西。自定义 MarkupExtension 怎么样?

类似

<Image Source="PathResolver BasePath=/Resource/Images/foo.png" />

其中基本路径是路径的某个相对部分,可用于根据目标环境(WPF 或 Silverlight)解析完整路径

我认为 Pavlo 的解决方案更简洁一些,但自定义标记扩展可能会给您更多的灵活性,而且创建起来也很简单

【讨论】:

这不适用于 Silverlight 4 及更低版本,自定义 MarkupExtensions 计划在 v5 中首次亮相。 啊,好电话,我最近没有与 Silverlight 合作过,忘了它缺少自定义标记扩展。很高兴知道它即将推出

以上是关于如何从 XAML 为复合应用程序加载图像?的主要内容,如果未能解决你的问题,请参考以下文章

从 URL 加载 Compound Drawable 中的图像

如何动态加载用户控件?

在 WPF 中动态加载图像

如何使用 C# 反转 XAML PNG 图像的颜色?

如何在 Windows 8 商店应用程序中正确添加图像 (C#/XAML)

如何在 XAML 应用程序中显示 .ico 图像文件?