Исключение URI возникает при работе с Metro и изображениями

Я работаю над приложением пользовательского интерфейса Metro для Windows 8 и пытаюсь получить изображение из папки проекта.

Вот мой исходный код:

public static Image GetImage(string path, int width, int height, int margin)
    {
        Image img = new Image();
        img.Width = width;
        img.Height = height;
        img.Margin = new Windows.UI.Xaml.Thickness(margin);

        BitmapImage bi = new BitmapImage(new Uri(path, UriKind.Absolute));

        img.Source = bi;

        return img;
    }

И вызов метода:

Image = Extension.GetImage("Classe;component/Images/faq.png", 100, 100, 0);

И ошибка:

Exception:Thrown: "Invalid URI: The format of the URI could not be determined." (System.UriFormatException)
A System.UriFormatException was thrown: "Invalid URI: The format of the URI could not be determined."

Если я изменю тип URI на относительный:

Exception:Thrown: "The given System.Uri cannot be converted into a Windows.Foundation.Uri. Please see http://go.microsoft.com/fwlink/?LinkID=215849 for details." (System.ArgumentException)
A System.ArgumentException was thrown: "The given System.Uri cannot be converted into a Windows.Foundation.Uri. Please see http://go.microsoft.com/fwlink/?LinkID=215849 for details."

Путь к изображению: Images/faq.png. Установите «Содержимое» и «Всегда копировать».


person Robert Gawdzik    schedule 10.08.2012    source источник


Ответы (1)


Судя по документации для Windows.Foundation.Uri, WinRT не поддерживает относительные URI. MS изобрела еще один формат URI для ресурсов WinRT.

Попробуйте что-то вроде этого и посмотрите, работает ли это:

new Uri("Classe://MyAssembly/component/Images/faq.png") 

Примечание: ВЫ НЕ добавляете фактическое имя сборки — часть MyAssembly ЯВЛЯЕТСЯ БУКВАЛЬНЫМ ТЕКСТОМ.

person Xtian Macedo    schedule 10.08.2012
comment
В вопросе я уже заявлял, что если вы измените на URIKind.Relative: если я изменю тип URI на относительный: Exception:Thrown: данный System.Uri не может быть преобразован в Windows.Foundation.Uri. Дополнительные сведения см. на странице go.microsoft.com/fwlink/?LinkID=215849. (System.ArgumentException) Возникло исключение System.ArgumentException: данный System.Uri не может быть преобразован в Windows.Foundation.Uri. Дополнительные сведения см. на странице go.microsoft.com/fwlink/?LinkID=215849. - person Robert Gawdzik; 10.08.2012
comment
Судя по документации для Windows.Foundation.Uri, похоже, что WinRT не поддерживает относительные URI. MS изобрела еще один формат URI для ресурсов WinRT. Попробуйте что-то вроде этого и посмотрите, работает ли это: new Uri(ms-resource://MyAssembly/component/Images/faq.png) Обратите внимание, что вы не добавляете фактическое имя сборки — часть MyAssembly представляет собой буквальный текст. - person Xtian Macedo; 10.08.2012
comment
Удивительно, странно, что Microsoft делает так много таких стандартов :( Надеюсь, когда они выпустят полную версию .NET 4.5/5 и VS2012, они вернут UriKind.Relative для работы с WinRT. Я мог бы также отметить этот ответ как вопрос , пожалуйста, поместите новый Uri (Classe://MyAssembly/component/Images/faq.png) в свой отредактированный ответ Спасибо. - person Robert Gawdzik; 10.08.2012