我无法弄清楚适用于我的资源的相对路径。我已经尝试了我能想到的一切。唯一有效的是绝对路径只在我的系统上正确,但在任何部署版本中都是不正确的。
据我所知,这条非常简单的路径应该可行。
public class GreyscaleEffect : ShaderEffect
{
private static PixelShader _pixelShader = new PixelShader()
{ UriSource = new Uri("/Effects/Greyscale.ps", UriKind.Relative) };
我收到错误The type initializer for 'FSR.WPF.Utilities.UI. GreyscaleEffect' threw an exception.
内部异常:Cannot locate resource 'effects/greyscale.ps'.
我也尝试了以下内容:
Uri(";component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/;component/Effects/Greyscale.ps", UriKind.Relative)
Uri("/FSR.WPF.Utilities.UI;component/Effects/Greyscale.ps", UriKind.Relative)
在其他地方(在MUSUI的xaml文件中),使用以下路径,它可以正常工作:
<Image Source="/FSR.WPF.Utilities.UI;component/assets/CurrencyFlags/USD.png"
所以我无法弄清楚为什么这种类似的情况不起作用。
只有以下绝对路径有效:
Uri("C:\TFS\MUS 6.1.x\Mosaic Middleware\FSR.WPF.Utilities\FSR.WPF.Utilities.UI" +
"\Effects\Greyscale.ps")
我还尝试了以上所有内容,并在字符串前面使用@
,使用UriKind.Absolute,并完全省略第二个参数。没有什么可行,但绝对的道路,我正在失去理智。
这是解决方案结构。主项目是MUSUI,底部是粗体。此效果类和.ps文件都位于Effects文件夹中,该文件夹位于引用的程序集FSR.WPF.Utilities.UI的根目录。
无论如何,我知道这必须以某种方式工作。任何可以找出最短工作相对路径的人,特别是如果它不需要在程序集名称中进行硬编码,就会得到奖品。
答案 0 :(得分:7)
您不能指定相对URI,它必须是绝对的。当您在XAML中指定相对URI时,它实际上使用IUriContext.BaseUri
转换为绝对URI,但在C#代码中没有关于当前位置的信息,因此您不能使用相对URI。
您需要使用pack://
URI scheme:
UriSource = new Uri("pack://application:,,,/YourAssembly;component/Effects/Greyscale.ps");
答案 1 :(得分:0)
我认为这是WPF的PixelShader类错误,因为PixelShader没有实现IUriContext接口,它可以持久保存BaseUri上下文,而System.Windows.Controls.Image&amp; System.Windows.Documents.Hyperlink&amp; System.Windows.ResourceDictionary等实现IUriContext,因此可以使用相对Uri
要启用PixelShader相对Uri敏感,可以使用超链接作为重定向器,例如
<Window>
<Window.Resources>
<Hyperlink x:Key="ItemForRedirectKey" NavigateUri="{Your PixelShader.ps relative uri}" TargetName="{Binding Path= NavigateUri,RelativeSource={RelativeSource Self}}" />
<PixelShader x:Key="PixelShaderKey" UriSource={Binding Path=TargetName,Source={StaticResouce ItemForRedirectKey} }/>
</Window.Resources>
</Window>