Cómo cargar un mapimento de bits en metroui dinámicamente
-
27-10-2019 - |
Pregunta
He estado experimentando con Windows 8 y Metro UI, he escrito una carga perfectamente razonable de una imagen de mapa de bits, pero no parece estar cargando, se agradece cualquier ayuda.
Public Sub New(Image As String)
Debug.Print("ms-resource://MyAssembly/" & Image)
Img = New ImageBrush()
Dim Bitmap As New BitmapImage()
Bitmap.UriSource = New Uri("ms-resource://MyAssembly/" & Image, UriKind.Absolute)
Img.ImageSource = Bitmap
Width = Bitmap.PixelWidth
Height = Bitmap.PixelHeight
Debug.Print("Height: " & Height & " Width: " & Width)
End Sub
En este ejemplo, el ancho y la altura siempre toman valores de cero. Se representa en la misma clase.
Public Sub Render(X As Integer, Y As Integer, Canv As Canvas)
Dim Sprite As New Shapes.Rectangle
Sprite.Width = CDbl(Width)
Sprite.Height = CDbl(Height)
Sprite.Fill = Img
Sprite.SetValue(Canvas.TopProperty, CDbl(Y))
Sprite.SetValue(Canvas.LeftProperty, CDbl(X))
Canv.Children.Add(Sprite)
End Sub
End Class
Y aquí es donde se crea/llamado:
V = New Sprite("Images/Test.bmp")
gameRoot.Children.Clear()
V.Render(100, 100, gameRoot)
===
No es un problema con mi objeto de lienzo, porque si lo lleno con Sprite.Fill = New SolidColorBrush(Colors.White)
Luego funciona bien, y veo un cuadrado blanco en mi pantalla, el mapa de bits en cuestión está configurado para "copiar siempre", y está en la carpeta de destino cuando la veo.
No estoy muy seguro de lo que estoy haciendo mal.
Solución
Bueno, logré resolver esto yo mismo.
Puedes obtener un uri base usando Me.uri; o en c# this.uri.
Aquí está el código terminado que permitirá a cualquiera cargar una imagen de mapa de bits en un lienzo; e incluso rotarlo.
Escribí esto yo mismo, por lo que cualquiera que lo descubra tener el mismo problema puede sentirse libre de usarlo como quieran.
La imagen debe tomar el formato "FilePath/Image.Extension"
Public Class Sprite
'Public Shared Baseuri As Uri
Public Img As ImageBrush
Public Bitmap As BitmapImage
Public Sub New(Image As String, Base As Uri)
'Debug.Print("BASE:" & Base.ToString)
'Debug.Print("USING:" & Image)
'Debug.Print("RESULT:" & New Uri(Base, Image).ToString)
Img = New ImageBrush()
Bitmap = New BitmapImage(New Uri(Base, Image))
End Sub
Public Overloads Sub Render(X As Integer, Y As Integer, Width As Integer, Height As Integer, Canv As Canvas)
Img.ImageSource = Bitmap
Dim Sprite As New Shapes.Rectangle
Sprite.Width = CDbl(Width)
Sprite.Height = CDbl(Height)
Sprite.Fill = Img
Sprite.SetValue(Canvas.TopProperty, CDbl(Y))
Sprite.SetValue(Canvas.LeftProperty, CDbl(X))
Canv.Children.Add(Sprite)
End Sub
Public Overloads Sub Render(X As Integer, Y As Integer, Width As Integer, Height As Integer, Canv As Canvas, Angle As Integer)
Img.ImageSource = Bitmap
Dim Sprite As New Shapes.Rectangle
Sprite.Width = CDbl(Width)
Sprite.Height = CDbl(Height)
Sprite.Fill = Img
Sprite.SetValue(Canvas.TopProperty, CDbl(Y))
Sprite.SetValue(Canvas.LeftProperty, CDbl(X))
Dim v As New Windows.UI.Xaml.Media.RotateTransform
v.Angle = CDbl(Angle)
v.CenterX = Width / 2
v.CenterY = Height / 2
Sprite.RenderTransform = v
Canv.Children.Add(Sprite)
End Sub
End Class