将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
将相对路径更改为打包路径?
经过大量的尝试和错误,我想出了一个我想分享的解决方法。
我创建了新的类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
属性,该属性会尽可能晚地将相对路径转换为绝对路径。