8

例如,我有以下项目结构:

Root\Core\Application.exe
Root\Modules\Assembly.dll
Root\Modules\Icons\Icon.png

我的 Application.exe 加载 Assembly.dll。Assembly.dll 包括一个带有图像控件的 WPF UserControl。Icon.png 不是嵌入式资源,它是本地文件(构建:内容)。

我在图像控件的源属性中尝试了所有可能的 URI,但它从不显示图像:-(

<Image Source="Icons\Icon.png" />
<Image Source="pack://application:,,,/Icons\Icon.png" />
<Image Source="pack://application:,,,/Assembly;component/Icons/Icon.png" />

等等

URI 的外观如何?

4

1 回答 1

5

此语句意味着您不能引用程序集中的内容文件...(因此只有在您的应用程序中指定的内容文件才能使用“application://”解析)。

http://msdn.microsoft.com/en-us/library/aa970069(v=vs.85).aspx

不包括引用程序集中的内容文件,因为它们不受 WPF 支持。引用程序集中的嵌入文件的包 URI 是唯一的,因为它们包括被引用程序集的名称和 ;component 后缀。源文件站点的包 URI 是唯一的,因为它们使用的是唯一使用 siteoforigin:/// 权限的包 URI。

您可能会在某个地方出现“siteoforigin”,它指的是您的 .exe 运行的位置。

Source="pack://siteoforigin:,,,/../Modules/Icons/Icon.png"

或者

Source="pack://siteoforigin:,,,/Icons/Icon.png"

虽然它可能不支持相对路径。

也试一试:

Source="../Modules/Icons/Icon.png" 

和这个:

Source="Icons/Icon.png" 

尝试使用 Pack URI 时的一个提示是使用 构建它们PackUriHelper,以便您符合正确的语法/语义。

查看一些相关帖子:


另一个想法……

您可以定义自己的 MarkupExtension,它有助于为您的 png 文件构建绝对路径。

您将有一个全局配置设置,该设置在使用 LoadFrom 加载 DLL 之前设置。

然后你会让你的 XAML 使用扩展:

Source={local:MyMarkupExtensionPathBuilder Icon.png}

以此为起点...在您的情况下,您不想使用“application://”...您希望将 Uri 构建为直接的绝对“文件”路径类型 URI,例如“C:\程序文件\myapplication\Root\Modules\Icons\icon.png”。

你可以让你的 MarkupExtension 直接返回 BitmapSource (或者只是让它返回一个字符串......然后 TypeConverter 无论如何都会解析为 BitmapSource )。

(您也可以使用使用 Converter 连接路径的 2 个部分的 Binding 做类似的事情,或者如果您使用一个,则让您的 ViewModel 进行连接......尽管标记扩展是一种更简洁的方法)

于 2012-09-03T10:44:32.910 回答