[Curso] WPF para programadores de Windows Forms 7

Hola a todos de nuevo, volvemos a la carga con otro artículo sobre WFP para programadores de Windows Forms. En este articulo voy a hablar sobre los diferentes tipos de controles que hay en WPF y como encontramos similitud con los controles de WF.

En artículos anteriores estuvimos hablando sobre el árbol de herencia de WPF y sobre las diferentes clases de las que heredaba un control normal de WPF, pusimos como ejemplo Label, al ser un control que vamos a usar mucho en nuestras aplicaciones.

System.Object
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ContentControl
                System.Windows.Controls.Label

Ahora en este curso nos vamos a posicionar en System.Windows.UIElement y vamos a ver las diferentes ramas de las cuales salen los demás controles de WPF y ver que funcionalidad nos proporciona.

UIElement es la primera clase de WPF que tiene soporte para dibujado (heredado de Visual), soporte para entrada (Input, heredado de DispatcherObject) y soporte para RouteEvents. Así que técnicamente esta es la clase que tendríamos que usar si queremos empezar a dibujar algo en la pantalla, es la clase que da un soporte más primitivo para el dibujado. En la clase UIElement tenemos un método virtual OnRender que podemos sobreescribir en nuestras clase para poder implementar la funcionalidad personalizada de dibujado de esa clase, en la que se nos pasa un DrawingContext con el que dibujamos la UI del control. DrawingContextes muy parecido a la clase Graphics de GDI y de hecho tiene métodos muy parecidos.

Aquí podemos ver un ejemplo de un control que se dibuja a si mismo con este método.

public class WigoVisual : UIElement
    {
        private Pen pincel;
        public WigoVisual()
        {
            pincel = new Pen(new SolidColorBrush(Colors.Red), 20);
        }
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);
            drawingContext.DrawLine(pincel, new Point(0, 0), new Point(100, 100));
            drawingContext.DrawRectangle(new SolidColorBrush(Colors.Green), new Pen(new SolidColorBrush(Colors.Blue), 5),
                new Rect(0, 0, 20, 20));
        }
    }

El control dibuja una línea desde (0,0) hasta (100,100) con el bolígrafo especificado, evidentemente esta clase no tiene soporte para Layout de ninguna manera porque nosotros al dibujar el control no tenemos en cuenta propiedades con Width o ActualWidth para dibujar la línea.

Como podréis comprender esta clase es muy básica en cuanto al soporte de Layout pero muy ponente para un dibujado más personalizado, si queremos ganar en funcionalidad existente tenemos que bajar en el árbol de herencia. La única clase pública del framework que hereda de UIElement es FrameworkElement, y es en esta clase donde se define mucha de la funcionalidad común de todos los controles del Framework, (es por eso que creo que se llama FrameworkElement).

FrameworkElement añade una serie de funcionalidad para que el soporte de Layout de la clase sea mucho más rico que con UIElement. Veámosla.

· Definición del sistema de Layout: define una serie de métodos que eran virtuales en UIElement para implementar el sistema de Layout de WPF.

· Define el árbol lógico de una aplicación WPF y deja la responsabilidad de definir cuál es a las clases herederas.

· Define los eventos del ciclo de vida de un control, eventos como Initialized, Loaded, Unloaded.

· Soporte para enlace a datos dinámico y búsqueda dinámica de recursos estáticos dentro del control.

· Define los estilos (Style) para los controles.

· Define el soporte para las animaciones de los controles.

FrameworkElement define una serie de propiedades básicas con las que podremos empezar a definir el Layout y los demás propiedades de la UI, a partir de esta clase podemos empezar a realizar Layout más complicados sin tener que explícitamente programarlos.

WPF permite que los programadores puedan sacar todo el partido del Layout a partir de una serie de clases que añaden funcionalidad especifica del nivel en el que se encuentran. Si volvemos atrás en el tiempo y recordamos como en Visual Basic 6 se hacían las cosas, los programadores más avanzados se hacían los cálculos ellos mismos para hacer que el control se moviese o fluyera a través del formulario, pero todos los cálculos tenían que ser hechos a mano, después con Windows Forms Microsoft nos dio dos propiedades muy interesantes de la clase Control Anchor y Dock, que permiten que un control se puedan quedar pillado a alguna de sus caras, o lo que es lo mismo que mantenga siempre la misma distancia. Todo este trabajo que antes se hacía a mano en Visual Basic ahora lo tenemos de “serie” dentro de Windows Forms, pues si seguimos avanzando en WPF ese cálculo de distancias se ha llevado al extremo, eso no significa que no se calcule internamente sino que no somos nosotros los responsables de hacer esos cálculos sino que WPF los hace por sí mismo.

Saludos. Luis.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *