在使用XamlWriter
进行序列化期间,我尝试序列化Image
控件。这些控件的这些Source
属性设置为相对URI。
但是,使用XamlWriter
序列化后,Image
控件包含以下路径:
原始路径
../test.png
XamlWriter路径
pack://application:,,,/test.png
有没有办法阻止XamlWriter
更改打包路径的相对路径?
答案 0 :(得分:0)
经过大量的反复试验后,我想出了一个我想要分享的解决方法。
我创建了新类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);
}
最后,为了方便起见,我在App.xaml文件中再次在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
属性,该属性将转换为{{1}}尽可能晚的绝对相对路径。