WPF 中的相对 uri 转换为错误的绝对目录

本文关键字:错误 转换 相对 uri WPF | 更新日期: 2023-09-27 18:30:35

我有一个属性类型为 Uri 的自定义控件。当我将此 Uri 设置为相对路径"InterfaceImages/Wait.gif"时,我希望它在使用它打开该文件时转换为当前目录。预期的目录如下所示:

C:'Users'MyUsername'Documents'Visual Studio 2012'Projects'MySolution'MyProject'InterfaceGraphics'Wait.gif

但相反,WPF 将其修改为:

              //-->Note the lowercased filenames<--//
C:'Users'MyUsername'documents'visual studio 2012'Projects'MySolution'MyProject'bin'Debug'InterfaceGraphics'Wait.gif

导致应用程序引发异常:"找不到路径'[上面显示的路径]'的一部分。

在我的代码中,我不会弄乱当前目录。那么它为什么要这样做呢?

我不知道这有多相关,但抛出它的函数调用是:

_gifDecoder = new GifBitmapDecoder(this.GifSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

其中this.GifSource是类型 System.Uri 的属性,创建项并设置属性的 XAML 如下所示:

<local:GifImage x:Name="WaitIcon" HorizontalAlignment="Center"
        Height="100" VerticalAlignment="Center" Width="100"
        MaxWidth="100" MaxHeight="100"
        GifSource="InterfaceGraphics/Wait.gif"/>

WPF 中的相对 uri 转换为错误的绝对目录

默认情况下,工作目录是包含可执行文件的目录。Visual Studio 生成的可执行文件位于项目的 bin/Debug(或 bin/Release)子文件夹中,因此这是您的工作目录。由于绝对路径是工作目录和相对路径的组合,因此您所看到的是完全正常的。

您有以下几种选择:

  • 在要在可执行文件目录中可用的项目项上将"复制到输出目录"属性设置为 true
  • 将项目调试属性中的工作目录更改为项目目录,而不是输出目录
  • 将图像作为资源嵌入到应用中(需要相应地更改代码以加载图像)

顺便说一句,如果你想显示动画GIF图像,你可以使用我的WpfAnimatedGif库,它正是这样做的。它也可以作为 NuGet 包提供。

相关文章: