windows-8 - para - universal crt kb2999226 windows 8
El System.Uri dado no se puede convertir en Windows.Foundation.Uri (7)
Estoy intentando cargar programáticamente BitmapImage en una aplicación XAML Metro. Aquí está mi código:
var uri = new Uri("/Images/800x600/BackgroundTile.bmp", UriKind.RelativeOrAbsolute);
var imageSource = new BitmapImage(uri);
La segunda línea falla con System.ArgumentException:
El System.Uri dado no se puede convertir en Windows.Foundation.Uri. Consulte http://go.microsoft.com/fwlink/?LinkID=215849 para obtener detalles.
El enlace solo va a la página de inicio de MSDN, por lo que no sirve de nada.
También traté de eliminar el líder /
, en caso de que WinRT tenga expectativas diferentes sobre los URI relativos, pero sigo teniendo la misma excepción.
¿Por qué recibo esta excepción por lo que parece ser un URI perfectamente válido?
En Consumer Preview, el formato de URL correcto aparentemente ha cambiado a ms-appx:/Images/800x600/BackgroundTile.bmp
A juzgar por la documentación de Windows.Foundation.Uri , parece que WinRT no es compatible con los URI relativos. Probé un pack://
URI , pero eso me dio una excepción UriFormatException, así que aparentemente esa no es la manera de hacerlo en WinRT tampoco.
Encontré la respuesta en este hilo : MS inventó otro formato URI para recursos WinRT. Esto funciona:
new Uri("ms-resource://MyAssembly/Images/800x600/BackgroundTile.bmp")
Tenga en cuenta que no agrega su nombre de ensamblado real - la parte MyAssembly
es texto literal.
Necesitará usar la propiedad BaseUri
la página o la propiedad BaseUri
del control de imagen de esta manera:
//using the page''s BaseUri property
BitmapImage bitmapImage = new BitmapImage(this.BaseUri,"/Images/800x600/BackgroundTile.bmp");
image.Source = bitmapImage;
o
//using the image control''s BaseUri property
image.Source = new BitmapImage(image.BaseUri,"/Images/800x600/BackgroundTile.bmp");
puedes ver la razón y la solución aquí
En caso de que todavía tenga problemas o se le pida que encuentre una aplicación para abrir el enlace, ¿está tratando de usar un WebView? Si es así, intente usar ms-appx-web en lugar de ms-appx.
Un ejemplo:
this.webBrowser.Navigate(new Uri("ms-appx-web:///level/level/level/index.html"));
También tenga en cuenta la falta del parámetro URIKind, que evidentemente no es necesario en estos casos.
(Creo que es posible que deba variar las barras diagonales principales según su referencia)
Sé que esto es viejo, pero espero que esto ayude. Escribí esto en XAML y funcionó para mí. El Ide que estoy usando es vs-2015 con 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")
};
}
}
Esto funcionaría en XAML pero no funcionaría en código ... por lo que cada control o página tiene una propiedad BaseUri que puede usar para construir el uri correcto para los activos ... aquí hay un ejemplo:
imageIcon.Source = new BitmapImage(new Uri(this.BaseUri, "Assets/file.gif"));
// O usa el uri base del imageIcon, lo mismo
imageIcon.Source = new BitmapImage(new Uri(imageIcon.BaseUri, "Assets/file.gif"));
también necesitaría establecer la acción de compilación en "Contenido" en lugar de en el Recurso incrustado ... de lo contrario, necesitará usar el protocolo ms-resource: //.