如何引用我的metro风格应用程序打包的图像源文件?

时间:2012-08-05 08:13:49

标签: c# windows-8 microsoft-metro

我有一个.png文件作为我的应用程序的内容。当我像xaml一样绑定它时

<ImageBrush x:Key="BtnBackImageBrush" ImageSource="/Assets/Images/back.png" />

一切都好。

我看了this article,当我尝试以编程方式访问此.png时出现错误。

我使用的代码:

Uri baseUri = new Uri("ms:appx");
Image img = new Image();
img.Source = new BitmapImage(new Uri(baseUri, "/Assets/Images/back.png"));
img.ImageFailed += (sender, args) => new MessageDialog("Error").ShowAsync();

我的问题是如何引用我的metro风格应用程序打包的图像源文件?

感谢您的建议。

更新 我找到了答案! 我们需要使用父FrameworkElement设置baseUri,而不是手动设置它。例如:

// Usage
myImage.Source = ImageFromRelativePath(this, "relative_path_to_file_make_sure_build_set_to_content");

public static BitmapImage ImageFromRelativePath(FrameworkElement parent, string path)
{
    var uri = new Uri(parent.BaseUri, path);
    BitmapImage result = new BitmapImage();
    result.UriSource = uri;
    return result;
}

感谢您article

2 个答案:

答案 0 :(得分:9)

  

new Uri(&#34; ms:appx&#34;);

我认为这是原始问题的根源。该方案是ms-appx而不是ms:appx

错误的URI:ms:appx://Assets/Images/back.png
好的URI:ms-appx://Assets/Images/back.png

但是使用FrameworkElement并不是一个坏主意,如果你真的试图像它的父母那样做范围 - 即使两者都有效,后者可能会更清楚你读者的意图(假设&#39 ;你的意图)。

答案 1 :(得分:6)

是的,你是对的,这是你问题的答案。

img.Source = ImageFromRelativePath(this, "Assets/Images/back.png");

public static BitmapImage ImageFromRelativePath(FrameworkElement parent, string path)
{
    var uri = new Uri(parent.BaseUri, path);
    BitmapImage bmp = new BitmapImage();
    bmp.UriSource = uri;
    return bmp;
}