Hola amigos
Hasta ahora he estado usando Windows Forms, pero para conseguir un aspecto gráfico más bonito en mi aplicación he decidido usar WPF. El problema es que cambian algunos eventos y propiedades y otras cosas y tengo que ir investigando.
Me ha pasado que ya tenía una apliación hecha en Windows Forms y he ido pasado el código a WPF pero resulta que concretamente esto no lo he sabido resolver.
En Windows Forms creé un Panel y un array de controles con Labels. El panel se crea desde un módulo que he llamado (modCrearPanel). El módulo también tiene eventos y más cosas pero no viene a cuento. La cuestión es poder crear los Labels dentro de un control StackPanel en WPF.
- Primero: Creo un Panel o StackPanel en el Windows Forms y en MainWindow en WPF
- Segundo paso:
EN WINDOWS FORMS
(no es el código original, es una simplificación)
Module Module1
Dim Etiqueta As New Label
Dim lblEtiqueta(4) As Label
Sub CrearPanel()
Dim Y As Integer = 20
Dim X As Integer
Form1.Panel1.BackColor = Color.DarkGray
X = 10 'valor X inicial
For I as Integer = 0 To 3
lblEtiqueta(I) = New Label
lblEtiqueta(I).Width = 15
lblEtiqueta(I).Height = 15
lblEtiqueta(I).BackColor = Color.Gray
lblEtiqueta(I).Location = New Point(X, Y) 'posición X e Y del cuadro
Form1.Panel1.Controls.Add(lblEtiqueta(I)) 'Crea el label
X = X + 20
Next
End Sub
End Module
CON WPF (NO FUNCIONA)
Module Module1
Dim Etiqueta As New Label
Dim lblEtiqueta(4) As Label
Dim Main As MainWindow
Public Sub CrearPanel()
Dim Y As Integer = 10
Dim X As Integer
Main.StackPanel1.Background = Brushes.DarkGray
X = 10
For i As Integer = 0 To 3
lblEtiqueta(i) = New Label
lblEtiqueta(i).Background = Brushes.Gray
lblEtiqueta(i).Width = 15
lblEtiqueta(i).Height = 15
lblEtiqueta(i).Margin = New Thickness(0, X, Y, 0)
X = X + 20
Main.StackPanel1.Children.Add(lblEtiqueta(i))
Next i
Main.Show()
End Sub
End Module
Para crear el Penel se llama desde el Load o Loaded en WPF a CrearPanel.
Con toda seguridad el problema está en la forma de poder hacer referencia al StackPanel1 que se encuentra en MainWindow. No se como se hace.
Gracias por ayuda
Encontré la forma Module Module1
Dim Etiqueta As New Label
Dim lblEtiqueta(4) As Label
Private app As Application
Private Main As MainWindow
Public Sub CrearPanel()
Dim Y As Integer = 10
Dim X As Integer
app = System.Windows.Application.Current
Main = CType(app.MainWindow, MainWindow)
Main.StackPanel1.Background = Brushes.DarkGray
X = 10
For i As Integer = 0 To 3
lblEtiqueta(i) = New Label
lblEtiqueta(i).Background = Brushes.Gray
lblEtiqueta(i).Width = 15
lblEtiqueta(i).Height = 15
lblEtiqueta(i).Margin = New Thickness(0, X, 0, Y)
X = X + 20
Main.StackPanel1.Children.Add(lblEtiqueta(i)) 'Crea el label
Next i
End Sub
End Module
Esto es lo que había que añadir al código para poder hacer referencia a objetos creados en MainWindow
Private app As Application
Private Main As MainWindow
Public Sub CrearPanel()
app = System.Windows.Application.Current
Main = CType(app.MainWindow, MainWindow)
Main.StackPanel1.Background = Brushes.DarkGray
End Sub
Encontré la solución aquí:
https://msdn.microsoft.com/es-es/library/vstudio/ms750944%28v=vs.100%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1Ahora que lo he conseguido hacer solo falta colocar correctamente los labels ya que en susitución a "Location" he usado "Margin" y no funciona igual. Veré a ver
Saludos