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)
Código
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)
Código
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
Código
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
Código
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-1
Ahora 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