1

我无法找出适用于我的资源的相对路径。我已经尝试了我能想到的一切。唯一有效的是一个绝对路径,它只在我的系统上是正确的,但在任何部署的版本中都是不正确的。

据我所知,这条非常简单的路径应该可行。

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 的根目录中。

在此处输入图像描述

无论如何,我知道这必须以某种方式工作。任何能够找出可能的最短工作相对路径的人,特别是如果它不需要在程序集名称中进行硬编码,都会获得奖励。

4

2 回答 2

7

您不能指定相对 URI,它必须是绝对的。当您在 XAML 中指定相对 URI 时,它实际上是使用 转换为绝对 URI IUriContext.BaseUri,但在 C# 代码中没有关于当前位置的信息,因此您不能使用相对 URI。

您需要使用pack://URI 方案指定 URI :

UriSource = new Uri("pack://application:,,,/YourAssembly;component/Effects/Greyscale.ps");
于 2012-04-26T23:53:17.880 回答
0

我认为这是 WPF 的 PixelShader 类 bug,因为 PixelShader 没有实现可以持久化 BaseUri 上下文的 IUriContext 接口,而 System.Windows.Controls.Image & System.Windows.Documents.Hyperlink & System.Windows.ResourceDictionary 等实现IUriContext,所以他们可以使用相对的 Uri

要启用 PixelShader 相对 Uri 敏感,可以使用 Hyperlink 作为重定向器,例如

    <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>
于 2013-10-25T09:57:24.077 回答