Ответ 1
В пользовательском превью правильный формат URL, по-видимому, изменился на ms-appx:/Images/800x600/BackgroundTile.bmp
Я пытаюсь программно загрузить 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?
В пользовательском превью правильный формат URL, по-видимому, изменился на ms-appx:/Images/800x600/BackgroundTile.bmp
Судя по документации для Windows.Foundation.Uri, похоже, что WinRT не поддерживает относительные URI. Я попробовал pack://
URI, но это дало мне исключение UriFormatException, поэтому, по-видимому, это не способ сделать это и в WinRT.
Я нашел ответ на этот поток: MS изобрела еще один формат URI для ресурсов WinRT. Это работает:
new Uri("ms-resource://MyAssembly/Images/800x600/BackgroundTile.bmp")
Обратите внимание, что вы не добавляете свое фактическое имя сборки - часть MyAssembly
имеет литеральный текст.
Вам нужно будет использовать свойство BaseUri
страницы или свойство управления изображением BaseUri
следующим образом:
//using the page BaseUri property
BitmapImage bitmapImage = new BitmapImage(this.BaseUri,"/Images/800x600/BackgroundTile.bmp");
image.Source = bitmapImage;
или
//using the image control BaseUri property
image.Source = new BitmapImage(image.BaseUri,"/Images/800x600/BackgroundTile.bmp");
вы можете увидеть причину и решение здесь
Если у вас все еще есть проблемы или вас попросят найти приложение, чтобы открыть ссылку, пытаетесь ли вы использовать WebView? Если да, попробуйте использовать ms-appx-web вместо ms-appx.
Пример:
this.webBrowser.Navigate(new Uri("ms-appx-web:///level/level/level/index.html"));
Также обратите внимание на отсутствие параметра URIKind - очевидно, вообще не требуется в этих случаях.
(Я полагаю, вам может потребоваться изменить ведущую косую черту в зависимости от вашей ссылки)
Это будет работать в 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"));
также вам нужно будет установить действие сборки в "Контент", а не в Embedded Resource... иначе вам нужно использовать протокол ms-resource://.
Я знаю, что это уже давно, но я надеюсь, что это поможет. Я написал это в 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>
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")
};
}
}