Данный System.Uri не может быть преобразован в Windows.Foundation.Uri - PullRequest
29 голосов
/ 27 сентября 2011

Я пытаюсь программно загрузить BitmapImage в приложение XAML Metro. Вот мой код:

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?

Ответы [ 7 ]

33 голосов
/ 05 марта 2012

В Consumer Preview правильный формат URL явно изменился на ms-appx:/Images/800x600/BackgroundTile.bmp

17 голосов
/ 27 сентября 2011

Судя по документации для Windows.Foundation.Uri , похоже, что WinRT не поддерживает относительные URI. Я попробовал pack:// URI , но это дало мне исключение UriFormatException, так что, очевидно, это не способ сделать это в WinRT.

Я нашел ответ на этой теме : MS изобрела еще один формат URI для ресурсов WinRT. Это работает:

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

Обратите внимание, что вы не добавляете свое фактическое имя сборки - часть MyAssembly является буквенным текстом.

3 голосов
/ 22 мая 2013

Вам нужно будет использовать свойство 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");

, вы можете увидеть причину ирешение здесь

0 голосов
/ 26 февраля 2017

МВВМ;)

    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")
            };
        }
    }
0 голосов
/ 20 января 2017

Я знаю, что это старо, но я надеюсь, что это помогает. Я написал это в XAML, и это сработало для меня. Идея, которую я использую - vs-2015 с 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>
0 голосов
/ 24 октября 2015

Это будет работать в XAML, но не будет работать в коде ... поэтому каждый элемент управления или страница имеет свойство BaseUri, которое вы можете использовать для создания правильного URI для ресурсов ... вот пример:

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

// Или используйте базовый URI из imageIcon, тоже самое

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

, также вам нужно установить для действия сборки значение «Контент», а не встроенный ресурс ... в противном случае вам нужноиспользуйте ms-resource: // protocol.

0 голосов
/ 10 июня 2015

Если у вас все еще есть проблемы или вас просят найти приложение для открытия ссылки, вы пытаетесь использовать WebView?Если это так, попробуйте использовать ms-appx-web вместо ms-appx.

Пример:

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

Также обратите внимание на отсутствие параметра URIKind - очевидно, не требуется вообще вэти случаи.

(я полагаю, вам может необходимо изменить начальные косые черты в зависимости от вашей ссылки)

...