URI相对路径 vs 绝对路径

6

我在我的C#代码中遇到了一些与URI有关的问题。

这个是有效的:

var uri = new Uri("d:/Programozas dotNet/Ugyfel/Ugyfel.ClientWpf/Skins/MainSkin.xaml");

很不幸,这些都不是:
var uri = new Uri("/Skins/MainSkin.xaml", UriKind.Relative);
var uri = new Uri("pack://application:,,,/Skins/MainSkin.xaml");
var uri = new Uri("Ugyfel.ClientWpf;/Skins/MainSkin.xaml", UriKind.Relative);

IOException: 找不到资源 'skins/mainskin.xaml'。

我该如何使用相对URI而不是绝对URI?


@Kash,有什么区别吗?op没有使用\\ - user57508
@AndreasNiedermair,你是对的,这不是逐字翻译。 - Kash
3个回答

26

那是一个愚蠢的错误。正确的方法是没有前导斜杠。

var uri = new Uri("Skins/MainSkin.xaml", UriKind.Relative);

感谢您的努力


你的第一个变量 uri = new Uri("/Skins/MainSkin.xaml", UriKind.Relative); 的例子对我来说很好用。如果省略 UriKind 参数,就会抛出异常。 - johnw182

4
相对 URL(在 WPF 或任何其他桌面应用程序中)是相对于 Environment.CurrentDirectory 的。通常这是您的 exe 所在的文件夹,但在 VS 单元测试环境中可能会有所不同。
我假设在您的项目中有一个名为 "Skins" 的文件夹,而且您的 exe 可能在 "bin\debug" 中。
最简单的方法是将 MainSkin.xaml 设置为复制到输出目录(在文件属性中),这样您就可以仅使用名称而不需要路径来引用它。

0

UriKind.Relative 仅在您尝试访问与应用程序位于同一位置的资源时才有意义。例如,在此代码中,它正在使用位于应用程序的 bin 文件夹中的图像。

private void btnDisplayDetails_Click(object sender, RoutedEventArgs e)
    {
        Person person = _ucPersons.GetSelectedPerson();
        if (person != null)
        {
            lblName.Content = person.Name;
            lblAge.Content = person.BirthDay.ToShortDateString();
            Uri uri = new Uri( "m_" + person.ImageRef + ".jpg", 
                UriKind.Relative);
            imgPerson.Source = BitmapFrame.Create(uri);
        }
    }

参考:Urikind.relative的确切含义是什么?


或者在您已经定义了基本URI的情况下使用。请参阅UriKind MSDN链接

绝对URI具有对资源的完整引用(例如:http://www.contoso.com/index.html),而相对URI依赖于先前定义的基本URI(例如:/index.html)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接