c# - 相对 SourceURI 不起作用

标签 c# wpf xaml .net-4.0

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

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

public class GreyscaleEffect : ShaderEffect
{
    private static PixelShader _pixelShader = new PixelShader()
        { UriSource = new Uri("/Effects/Greyscale.ps", UriKind.Relative) };

为此我收到错误 'FSR.WPF.Utilities.UI 的类型初始值设定项。 GreyscaleEffect' 抛出异常。 内部异常:找不到资源 '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 的根目录中。

enter image description here

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

最佳答案

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

您需要使用 pack:// URI scheme 指定 URI :

UriSource = new Uri("pack://application:,,,/YourAssembly;component/Effects/Greyscale.ps");

关于c# - 相对 SourceURI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342834/

相关文章:

c# - 用于滑入/滑出页面的 WPF 框架动画无法与数据触发器一起正常工作

wpf - 向提示 "Window is not supported in a WPF project"添加新的IronPython WPF窗口

c# - 拆分字符串时获取额外的空白项

c# - C# 的常见操作成本?

WPF如何还原Button背景色

c# - 默认 xml 命名空间在 XAML 中如何工作?

c# - 从整数到整数的转换方式有区别吗?

c# - 如何在gridview中隐藏和显示列

c# - wpf中的ViewModel层次结构

c# - 当值设置回有效值时,ValidationRules 不会消除错误