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

时间:2012-02-04 08:03:27

标签: c# wpf xaml serialization

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

但是,使用XamlWriter序列化后,Image控件包含以下路径:

原始路径

../test.png

XamlWriter路径

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

有没有办法阻止XamlWriter更改打包路径的相对路径?

1 个答案:

答案 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}}尽可能晚的绝对相对路径。