将pack://URI转换为相对URI

本文关键字:URI 相对 转换 pack | 更新日期: 2023-09-27 18:22:22

在使用XamlWriter进行序列化期间,我正在尝试序列化Image控件。这些控件的这些Source属性被设置为相对URI。

然而,在用XamlWriter序列化之后,Image控件包含如下路径:

原始路径

../test.png

XamlWriter路径

pack://application:,,,/test.png

是否有任何方法可以防止XamlWriter将相对路径更改为打包路径?

将pack://URI转换为相对URI

经过大量的尝试和错误,我想出了一个我想分享的解决方法。

我创建了新的类ImageData来封装我需要加载到Image控件中的相对Uri。

public class ImageData
{
    /// <summary>
    /// Relative path to image
    /// </summary>
    public string ImageSourceUri { get; set; }
    public ImageSource ImageSource
    {
        get { return new BitmapImage(App.GetPathUri(ImageSourceUri)); }
    }
}

然后我在App类中创建了一个函数(为了方便),将相对路径转换为绝对Uri。

    /// <summary>
    /// Converts a relative path from the current directory to an absolute path 
    /// </summary>
    /// <param name="relativePath">Relative path from the current directory</param>
    public static string GetPath(string relativePath)
    {
        return System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);
    }
    /// <summary>
    /// Converts a relative path from the current directory to an absolute Uri 
    /// </summary>
    /// <param name="relativePath">Relative path from the current directory</param>
    public static Uri GetPathUri(string relativePath)
    {
        return new Uri(GetPath(relativePath), UriKind.Absolute);
    }

最后,为了方便起见,我在XAML中再次在App.XAML文件中创建了一个DataTemplate

<Application.Resources>
    <DataTemplate DataType="{x:Type local:ImageData}">
        <Image Source="{Binding Path=ImageSource}"></Image>
    </DataTemplate>
</Application.Resources>

现在,当调用XamlWriter.Save方法时,输出的XAML如下所示:

<d:ImageData ImageSourceUri="test_local.png" />

因此,路径被存储为string类型的相对路径,然后当使用XamlReader.Load再次加载XAML时,DataTemplate绑定到ImageSource属性,该属性会尽可能晚地将相对路径转换为绝对路径。