The given System.Uri cannot be converted into a Wi

2019-01-08 21:34发布

I'm trying to programmatically load a BitmapImage in a XAML Metro app. Here's my code:

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

The second line crashes with a System.ArgumentException:

The given System.Uri cannot be converted into a Windows.Foundation.Uri. Please see http://go.microsoft.com/fwlink/?LinkID=215849 for details.

The link just goes to the MSDN home page, so it's no use.

I've also tried removing the leading /, in case WinRT has different expectations about relative URIs, but I still get the same exception.

Why am I getting this exception for what seems to be a perfectly valid URI?

7条回答
Bombasti
2楼-- · 2019-01-08 22:03

In the Consumer Preview, the correct URL format has apparently changed to ms-appx:/Images/800x600/BackgroundTile.bmp

查看更多
Fickle 薄情
3楼-- · 2019-01-08 22:08

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")
            };
        }
    }
查看更多
爱情/是我丢掉的垃圾
4楼-- · 2019-01-08 22:18

I know this is old but I hope this helps. I wrote this in XAML and it worked for me. The Ide I'm using is vs-2015 with win-10.

<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>
查看更多
Root(大扎)
5楼-- · 2019-01-08 22:25

Judging from the documentation for Windows.Foundation.Uri, it looks like WinRT doesn't support relative URIs. I tried a pack:// URI, but that gave me a UriFormatException, so apparently that's not the way to do it in WinRT either.

I found the answer on this thread: MS invented yet another URI format for WinRT resources. This works:

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

Note that you don't add your actual assembly name -- the MyAssembly part is literal text.

查看更多
在下西门庆
6楼-- · 2019-01-08 22:25

This would work in XAML but would not work in code... so each control or page has a BaseUri property which you can use to build the proper uri for assets... here is an example:

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

// Or use the base uri from the imageIcon, same thing

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

also you would need to set the build action to "Content" rather than Embedded Resource... otherwise you need to use the ms-resource:// protocol.

查看更多
太酷不给撩
7楼-- · 2019-01-08 22:27

You will need to use the page's BaseUri property or the image control's BaseUri property like this:

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

or

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

you can see the reason and solution here

查看更多
登录 后发表回答