Consideraciones sobre el diseño del elemento WindowsFormsHost
Este tema describe cómo el elemento WindowsFormsHost interactúa con el sistema de diseño de WPF.
WPF y Windows Forms admiten una lógica diferente, pero similar, para cambiar el tamaño y colocar elementos en un formulario o página. Cuando se crea una interfaz de usuario (UI) híbrida que hospeda controles de Windows Forms en WPF, el elemento WindowsFormsHost integra los dos esquemas de diseño.
Diferencias en el diseño entre WPF y Windows Forms
WPF usa el diseño independiente de la resolución. Todas las dimensiones de diseño de WPF se especifican mediante píxeles independientes del dispositivo. Un píxel independiente del dispositivo tiene un tamaño de una noventa y seisava parte de una pulgada y es independiente de la resolución, por lo que se obtienen resultados similares independientemente de si se representa en un monitor de 72 ppp o en una impresora de 19.200 ppp.
WPF también se basa en el diseño dinámico. Esto significa que un elemento de interfaz de usuario se organiza en un formulario o página según su contenido, su contenedor de diseño primario y el tamaño de pantalla disponible. El diseño dinámico facilita la localización ajustando automáticamente el tamaño y la posición de los elementos de la interfaz de usuario cuando las cadenas que contienen cambian de longitud.
El diseño en Windows Forms depende del dispositivo y es más probable que sea estático. Normalmente, los controles de Windows Forms se colocan de forma absoluta en un formulario utilizando dimensiones especificadas en píxeles de hardware. Sin embargo, Windows Forms admite algunas características de diseño dinámico, como se resume en la tabla siguiente.
Característica de diseño | Descripción |
---|---|
Ajuste automático de tamaño | Algunos controles de Windows Forms cambian de tamaño para mostrar su contenido correctamente. Para obtener más información, vea Información general sobre la propiedad AutoSize. |
Delimitar y acoplar | Los controles de Windows Forms admiten el posicionamiento y el tamaño en función del contenedor primario. Para obtener más información, vea Control.Anchor y Control.Dock. |
Escalado automático | Los controles contenedor cambian de tamaño y también sus elementos secundarios en función de la resolución del dispositivo de salida o del tamaño, en píxeles, de la fuente de contenedor predeterminada. Para obtener más información, vea Escalado automático en Windows Forms. |
Contenedores de diseño | Los controles FlowLayoutPanel y TableLayoutPanel organizan sus controles secundarios y se dimensionan según su contenido. |
Limitaciones de diseño
En general, los controles de Windows Forms no se pueden escalar y transformar en la medida posible en WPF. En la siguiente lista se describen las limitaciones conocidas cuando el elemento WindowsFormsHost intenta integrar su control hospedado de Windows Forms en el sistema de diseño de WPF.
En algunos casos no se puede cambiar el tamaño de los controles de Windows Forms (o solo se pueden fijar unas dimensiones específicas). Por ejemplo, los controles ComboBox de Windows Forms solo admiten una altura, que se define con el tamaño de fuente del control. En un diseño dinámico de WPF donde los elementos se pueden ajustar verticalmente, los controles ComboBox hospedados no se ajustarán según lo previsto.
Los controles de Windows Forms no se pueden girar ni sesgar. El elemento WindowsFormsHost genera el evento LayoutError si se aplica una transformación de inclinación o rotación. Si no controla el evento LayoutError, se genera un InvalidOperationException.
En la mayoría de los casos, los controles de Windows Forms no admiten el escalado proporcional. Aunque las dimensiones generales del control se escalarán, los controles secundarios y los elementos de los componentes del control podrían no cambiar de tamaño según lo previsto. Esta limitación depende del grado de compatibilidad del escalado de cada control de Windows Forms. Además, no se pueden escalar los controles de Windows Forms a un tamaño de 0 píxeles.
Los controles de Windows Forms admiten el autoescalado, en el que el formulario cambiará de tamaño automáticamente y sus controles en función del tamaño de la fuente. En una interfaz de usuario de WPF, al cambiar el tamaño de fuente no se cambia el tamaño de todo el diseño, aunque es posible que algunos elementos cambien de tamaño dinámicamente.
Orden Z
En una interfaz de usuario de WPF, puede cambiar el orden z de los elementos para controlar el comportamiento de superposición. Los controles hospedados de Windows Forms se dibujan en un HWND independiente, por lo que siempre se dibujan en la parte superior de los elementos de WPF.
Un control de Windows Forms hospedado también se dibuja sobre cualquier elemento Adorner.
Comportamiento del diseño
En las secciones siguientes se describen aspectos específicos del comportamiento del diseño al hospedar los controles de Windows Forms en WPF.
Escalado, conversión de unidad e independencia del dispositivo
Siempre que el elemento WindowsFormsHost realiza operaciones que implican dimensiones de WPF y Windows Forms, intervienen dos sistemas de coordenadas: píxeles independientes del dispositivo para WPF y píxeles de hardware para Windows Forms. Por lo tanto, debe aplicar las conversiones de unidades y escalado adecuadas para lograr un diseño coherente.
La conversión entre los sistemas de coordenadas depende de la resolución actual del dispositivo y de cualquier transformación de diseño o representación aplicada al elemento WindowsFormsHost o a sus antecesores.
Si el dispositivo de salida es de 96 ppp y no se ha aplicado ninguna escala al elemento WindowsFormsHost, un píxel independiente del dispositivo es igual a un píxel de hardware.
Todos los demás casos requieren el escalado del sistema de coordenadas. El control hospedado no se cambia de tamaño. En cambio, el elemento WindowsFormsHost intenta escalar el control hospedado y todos sus controles secundarios. Dado que Windows Forms no admite completamente el escalado, el elemento WindowsFormsHost se escala hasta el grado admitido por controles concretos.
Invalide el método ScaleChild para proporcionar un comportamiento de escalado personalizado para el control de Windows Forms hospedado.
Además del escalado, el elemento WindowsFormsHost controla los casos de redondeo y desbordamiento, como se describe en la tabla siguiente.
Problema de conversión | Descripción |
---|---|
Redondeo | Las dimensiones de los píxeles independientes del dispositivo de WPF se especifican como double , y las dimensiones de los píxeles del hardware de Windows Forms se especifican como int . En los casos en que las dimensiones basadas en double se convierten en dimensiones basadas en int , el elemento WindowsFormsHost utiliza el redondeo estándar, de modo que los valores fraccionarios inferiores a 0,5 se redondean a 0. |
Desbordamiento | Cuando el elemento WindowsFormsHost se convierte de valores double a valores int , es posible el desbordamiento. Los valores superiores a MaxValue se fijan en MaxValue. |
Propiedades relacionadas con el diseño
Las propiedades que controlan el comportamiento del diseño en los controles de Windows Forms y en los elementos de WPF se asignan adecuadamente mediante el elemento WindowsFormsHost. Para más información, vea Asignación de propiedades en formularios Windows Forms y WPF.
Cambios de diseño en el control hospedado
Los cambios de diseño en el control de Windows Forms hospedado se propagan a WPF para desencadenar actualizaciones de diseño. El método InvalidateMeasure en WindowsFormsHost asegura que los cambios de diseño en el control hospedado hacen que se ejecute el motor de diseño de WPF.
Controles Windows Forms de tamaño continuo
Los controles de Windows Forms que admiten el escalado continuo interactúan plenamente con el sistema de diseño de WPF. El elemento WindowsFormsHost utiliza los métodos MeasureOverride y ArrangeOverride como es habitual para dimensionar y organizar el control Windows Forms hospedado.
Algoritmo de dimensionamiento
El elemento WindowsFormsHost utiliza el siguiente procedimiento para dimensionar el control hospedado:
El elemento WindowsFormsHost invalida los métodos MeasureOverride y ArrangeOverride.
Para determinar el tamaño del control hospedado, el método MeasureOverride llama al método GetPreferredSize del control hospedado con una restricción traducida de la restricción pasada al método MeasureOverride.
El método ArrangeOverride intenta ajustar el control hospedado a la restricción de tamaño promocionada.
Si la propiedad Size del control hospedado coincide con la restricción especificada, el control hospedado se ajusta a la restricción.
Si la propiedad Size no coincide con la restricción especificada, el control hospedado no admite el tamaño continuo. Por ejemplo, el control MonthCalendar solo permite tamaños discretos. Los tamaños permitidos para este control consisten en números enteros (que representan el número de meses) tanto para la altura como para la anchura. En casos como este, el elemento WindowsFormsHost se comporta de la siguiente manera:
Si la propiedad Size devuelve un tamaño mayor que la restricción especificada, el elemento WindowsFormsHost recorta el control hospedado. La altura y la anchura se controlan por separado, por lo que el control hospedado puede recortarse en cualquier dirección.
Si la propiedad Size devuelve un tamaño menor que la restricción especificada, WindowsFormsHost acepta este valor de tamaño y devuelve el valor al sistema de diseño de WPF.
Vea también
- ElementHost
- WindowsFormsHost
- Tutorial: Organizar controles de formularios Windows Forms en WPF
- Arranging Windows Forms Controls in WPF Sample (Ejemplo de cómo organizar controles de Windows Forms en WPF)
- Asignación de propiedades en formularios Windows Forms y WPF
- Migración e interoperabilidad
.NET Desktop feedback