相对于程序集的本地文件的URI

时间:2012-09-03 10:11:27

标签: wpf xaml uri relative-path .net-assembly

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

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如何看起来像?

1 个答案:

答案 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是一个更简洁的方法来做到这一点)