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

Sas*_*nge 8 wpf xaml uri relative-path .net-assembly

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

Root\Core\Application.exe
Root\Modules\Assembly.dll
Root\Modules\Icons\Icon.png
Run Code Online (Sandbox Code Playgroud)

我的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" />
Run Code Online (Sandbox Code Playgroud)

等等

URI如何看起来像?

Col*_*ith 5

此声明暗示您无法引用程序集中的内容文件...(因此,只能使用"application://"解析应用程序中指定的内容文件).

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

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

您可能会在某处使用"siteoforigin",它指的是运行.exe的位置.

Source="pack://siteoforigin:,,,/../Modules/Icons/Icon.png"
Run Code Online (Sandbox Code Playgroud)

要么

Source="pack://siteoforigin:,,,/Icons/Icon.png"
Run Code Online (Sandbox Code Playgroud)

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

这也是一个镜头:

Source="../Modules/Icons/Icon.png" 
Run Code Online (Sandbox Code Playgroud)

还有这个:

Source="Icons/Icon.png" 
Run Code Online (Sandbox Code Playgroud)

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

查看一些相关帖子:


另一个想法......

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

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

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

Source={local:MyMarkupExtensionPathBuilder Icon.png}
Run Code Online (Sandbox Code Playgroud)

使用这个作为起点...在你的情况下,你不想使用"application://"虽然...你想建立Uri作为一个直的绝对"文件"路径类型URI,例如"C:\ Program Files\myapplication\Root\Modules\Icons\icon.png".

您可以让MarkupExtension直接返回BitmapSource(或者只是让它返回一个字符串......然后TypeConverter会解析为BitmapSource).

(您也可以使用Binding来执行类似的操作,使用转换器连接路径的两个部分,或者如果您使用一个部分,则使ViewModel执行连接...尽管markupextension是一种更简洁的方法)