例如,我有以下项目结构:
Root\Core\Application.exe
Root\Modules\Assembly.dll
Root\Modules\Icons\Icon.png
我的Application.exe加载Assembly.dll。 Assembly.dll包含带有Image控件的WPF UserControl。 Icon.png不是嵌入式资源,它是本地文件(Build:Content)。
我在Image Control的Source-Property中尝试了所有可能的URI,但它从不显示图像: - (
<Image Source="Icons\Icon.png" />
<Image Source="pack://application:,,,/Icons\Icon.png" />
<Image Source="pack://application:,,,/Assembly;component/Icons/Icon.png" />
等
URI如何看起来像?
答案 0 :(得分:5)
此声明暗示您无法引用程序集中的内容文件...(因此,只能使用“application://”解析应用程序中指定的内容文件。)
http://msdn.microsoft.com/en-us/library/aa970069(v=vs.85).aspx
引用的程序集中的内容文件不包括在内,因为它们 WPF不支持。引用的嵌入文件的包URI 程序集是唯一的,因为它们都包含了名称 引用的程序集和;组件后缀。网站的包装URI 原始文件是唯一的,因为它们使用的是唯一的包URI 使用siteoforigin:///权限。
你可能会找到“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:\ Program Files \ myapplication \ Root \ Modules \ Icons \ icon.png”。
你可以让你的MarkupExtension直接返回BitmapSource(或者只是让它返回一个字符串......然后TypeConverter会解析为BitmapSource)。
(你也可以使用一个类似于Binding的东西,使用转换器来连接路径的两个部分,或者让你的ViewModel进行连接,如果你使用一个...... markupextension是一个更简洁的方法来做到这一点)