Pues eso… que estoy haciendo una aplicación para convertir los Windows Forms en WPF (Xaml) y tengo que recorrer todos los formularios de la aplicación para ir convirtiéndolos y he buscado en Internet cómo hacer eso y… ¡no lo he encontrado!
Mostrar todos los formularios de un ensamblado (aplicación) estén o no abiertos
Así que… me dije que yo tenía algún código haciendo Reflection para mostrar una clase y va y resulta que en ese ejemplo tenía la respuesta que buscaba… ¡lo que no esté en el sitio del Guille!
Concretamente en esta página:
Las clases de un ensamblado usando Reflection (por ejemplo para saber los formularios de nuestra aplicación)
Y para que no me vuelva a ocurrir lo mismo en un futuro (ese artículo lo escribí el 13 de septiembre de 2004… ¡casi ná! ) me he decidido a escribir este nuevo…
No te voy a explicar mucho (eso ya lo hice en ese artículo) solo te mostraré el código de ejemplo (y te pondré el proyecto para que lo puedas descargar).
Y como siempre el código tanto para Visual Basic como para C#.
Primero te muestro el código que recorre los formularios del ensamblado o aplicación (que es lo que realmente te puede interesar) y después te mostraré el resto.
El código para Visual Basic:
''' <summary> ''' Para recorrer todos los formularios de un ensamblado ''' estén abiertos o no ''' Basado en el código del elGuille.info: ''' http://www.elguille.info/NET/dotnet/reflectionTiposdeunensamblado.htm ''' </summary> Private ass As System.Reflection.Assembly ''' <summary> ''' Mostrar todos los formularios de la aplicación actual, ''' estén o no en memoria, usando reflection. ''' Además de los formularios, mostrará: ''' My.Application (solo en VB) ''' Y todos los nombres esmpiezan con el espacio de nombres ''' ESPACIO_DE_NOMBRES.NombreForm ''' </summary> Private Sub mostrarForms() ' llena una colección con los formularios de esta aplicación ' estén o no en memoria. ' Muestra el resultado en un listbox lbForms.Items.Clear() For Each t As Type In ass.GetTypes() Dim nombreTipo = t.BaseType.Name ' También tendrá My.Application: (solo en VB) ' <espacio de nombres>.My.MyApplication If nombreTipo.ToLower().Contains("form") Then lbForms.Items.Add(t.FullName) End If Next End Sub
El código para C#:
/// <summary> /// Para recorrer todos los formularios de un ensamblado /// estén abiertos o no /// Basado en el código del elGuille.info: /// http://www.elguille.info/NET/dotnet/reflectionTiposdeunensamblado.htm /// </summary> private System.Reflection.Assembly ass; /// <summary> /// Mostrar todos los formularios de la aplicación actual, /// estén o no en memoria, usando reflection. /// Además de los formularios, mostrará: /// My.Application (solo en VB) /// Y todos los nombres esmpiezan con el espacio de nombres /// ESPACIO_DE_NOMBRES.NombreForm /// </summary> private void mostrarForms() { // llena una colección con los formularios de esta aplicación // estén o no en memoria. // Muestra el resultado en un listbox lbForms.Items.Clear(); foreach (Type t in ass.GetTypes()) { var nombreTipo = t.BaseType.Name; // También tendrá My.Application: (solo en VB) // <espacio de nombres>.My.MyApplication if (nombreTipo.ToLower().Contains("form")) lbForms.Items.Add(t.FullName); } }
Solo comentarte que en el código de Visual Basic he añadido 2 botones extras para mostrar los formularios Form2 y Form3 respectivamente. Esto solo es para probar que se pueden mostrar de las dos formas
Pero en cualquier caso, siempre se muestra un nuevo formulario, esté o no abierto.
En la figura 1 puedes ver la aplicación en funcionamiento, mostrando una lista de los formularios de la aplicación.
Figura 1. La aplicación en ejecución mostrando los formularios del ensamblado (aplicación)
Si te fijas en la figura 1, se muestra también «My.MyApplication» que no es un formulario, pero el tipo «base» es Form, y por eso se muestra. Esto no ocurre en C#, ya que C# no tiene la clase My.
Nota:
El código de Visual Basic lo he convertido con una utilidad que hay en la web:
Telerik Code Converter
Un extra: Mostrar un formulario en el segundo monitor
Esto ya lo publicaré otro día (realmente era lo que iba a publicar hoy junto con una explicación de los problemas de nuestro código de Windows Forms y Visual Studio y los monitores HDPI), y es que en el código incluyo cómo hacer que un formulario se muestre en el segundo monitor.
Actualmente estoy usando un portátil con la resolución 1920×1080 y usando el tamaño del texto (etc.) al 100% y un segundo monitor con 3840×2160 y el tamaño del texto, etc. al 150%.
Como te explicaré en otra ocasión, yo uso el Visual Studio abriéndolo desde la pantalla principal (la del portátil al 100%), pero después muevo el IDE de Visual Studio al segundo monitor, por tanto cuando ejecuto el código, lo que se muestra lo hace siempre en la pantalla del portátil, por eso busqué cómo hacer que se muestre un formulario en el segundo monitor, y ¡lo encontré!, eso sí, en código para C#, concretamente en una respuesta en el sitio de StackOverflow en un hilo con la siguiente pregunta: How do I ensure a form displays on the “additional” monitor in a dual monitor scenario?
La respuesta que me sirvió fue la 42, con este código:
var myScreen = Screen.FromControl(originalForm); var otherScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(myScreen)) ?? myScreen; otherForm.Left = otherScreen.WorkingArea.Left + 120; otherForm.Top = otherScreen.WorkingArea.Top + 120;
Que traducido a Visual Basic sería algo así:
Dim myScreen = Screen.PrimaryScreen Dim otherScreen = If(Screen.AllScreens.FirstOrDefault( Function(s) Not s.Equals(myScreen)), myScreen)
Y ¡esto es todo amigo!
Espero , como siempre, que te sea de utilidad y si no… al menos a mí dentro de 14 años me puede ser útil…
Nos vemos.
Guillermo
P.S.
El código de ejemplo completo y el enlace para la descarga de los proyectos (hechos con Visual Studio 2017 y .NET 4.7.2, ninguno de estos requisitos son necesarios para el código) te los muestro en otra página.
El código de VB y C# de: Mostrar todos los formularios de una aplicación