30

我正在尝试以编程方式在 XAML Metro 应用程序中加载 BitmapImage。这是我的代码:

var uri = new Uri("/Images/800x600/BackgroundTile.bmp", UriKind.RelativeOrAbsolute);
var imageSource = new BitmapImage(uri);

第二行因 System.ArgumentException 而崩溃:

给定的 System.Uri 无法转换为 Windows.Foundation.Uri。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=215849

链接只是转到 MSDN 主页,所以没有用。

我也尝试删除前导/,以防 WinRT 对相对 URI 有不同的期望,但我仍然得到相同的异常。

为什么我会因为似乎完全有效的 URI 而出现此异常?

4

7 回答 7

34

在 Consumer Preview 中,正确的 URL 格式显然已更改为ms-appx:/Images/800x600/BackgroundTile.bmp

于 2012-03-05T05:34:26.747 回答
17

Windows.Foundation.Uri 的文档来看,WinRT 似乎不支持相对 URI。我尝试了一个pack://URI,但这给了我一个 UriFormatException,所以显然这也不是在 WinRT 中执行此操作的方法。

我在这个线程上找到了答案:MS 为 WinRT 资源发明了另一种URI 格式。这有效:

new Uri("ms-resource://MyAssembly/Images/800x600/BackgroundTile.bmp")

请注意,您没有添加实际的程序集名称——该MyAssembly部分是文字文本。

于 2011-09-27T13:30:54.190 回答
3

您将需要像这样使用页面的BaseUri属性或图像控件的BaseUri属性:

//using the page's BaseUri property
BitmapImage bitmapImage = new BitmapImage(this.BaseUri,"/Images/800x600/BackgroundTile.bmp");
image.Source = bitmapImage;

或者

//using the image control's BaseUri property
image.Source = new BitmapImage(image.BaseUri,"/Images/800x600/BackgroundTile.bmp");

你可以在这里看到原因和解决方案

于 2013-05-22T14:52:39.287 回答
0

如果您仍然遇到问题或被要求查找应用程序来打开链接,您是否尝试使用 WebView?如果是这样,请尝试使用 ms-appx-web 而不是 ms-appx。

一个例子:

this.webBrowser.Navigate(new Uri("ms-appx-web:///level/level/level/index.html"));

还要注意缺少 URIKind 参数——显然在这些情况下根本不需要。

(我相信您可能需要根据您的参考改变前导斜杠)

于 2015-06-10T17:33:46.007 回答
0

我知道这很旧,但我希望这会有所帮助。我用 XAML 编写了这个,它对我有用。我正在使用的 Ide 是带有 win-10 的 vs-2015。

<Window>
<Grid>
<Grid.Background>
<ImageBrush ImageSource="NameOfYourImage.JPG or any Image type"/>
</Grid.Background>
<GroupBox x:Name="groupBox" Header="GroupBox" HorizontalAlignment="Left"   Height="248" Margin="58,33,0,0" VerticalAlignment="Top" Width="411">
<GroupBox.Background>
<ImageBrush ImageSource="NameOfYourImage.JPG or any Image type"/>
</GroupBox.Background>
</GroupBox>
</Grid>
</Window>
于 2017-01-20T06:31:45.807 回答
0

MVVM ;)

    public static ImageSource SetImageSource(string uriPath)//.com/image or some path
    {
        // this method very good for mvvm ;)
        try
        {   
            //In Model - public ImageSource AccountPhoto { get; set; } 
            //AccountPhoto = SetImageSource("some path");
            return return new BitmapImage()
            {
                CreateOptions = BitmapCreateOptions.IgnoreImageCache,
                UriSource = new Uri(uriPath)
            };
        }
        catch
        {
            Debug.WriteLine("Bad uri, set default image.");
            return return new BitmapImage()
            {
                CreateOptions = BitmapCreateOptions.IgnoreImageCache,
                UriSource = new Uri("ms-appx:///Avatar/Account Icon.png")
            };
        }
    }
于 2017-02-26T16:36:51.817 回答
0

这将在 XAML 中工作,但在代码中不起作用......所以每个控件或页面都有一个 BaseUri 属性,您可以使用它来为资产构建正确的 uri......这是一个示例:

    imageIcon.Source = new BitmapImage(new Uri(this.BaseUri, "Assets/file.gif"));

// 或者使用 imageIcon 中的基本 uri,同样的事情

    imageIcon.Source = new BitmapImage(new Uri(imageIcon.BaseUri, "Assets/file.gif"));

您还需要将构建操作设置为“内容”而不是嵌入式资源...否则您需要使用 ms-resource:// 协议。

于 2015-10-24T10:42:44.570 回答