如何从 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 中的图像