2011-11-20 22 views
8

He creado un Control de usuario compuesto, como es habitual, de una parte XAML y una parte de código subyacente. Ahora, necesito crear otro Control de usuario que comparta algunas de las funcionalidades de la primera, pero que tiene diferentes aspectos y también podría tener características adicionales en el código subyacente.Extendiendo controles de usuario en WPF

Mi primera idea fue crear una interfaz para reunir las funcionalidades comunes de los dos tipos de controles. ¿Es este el camino correcto? ¿Y cómo administraría las diferentes partes de XAML que debería tener? Cualquier consejo es bienvenido

+0

Parece que el código detrás es el problema y no el control. –

+0

Ritch, ¿qué quieres decir? – Tilvia

+1

Parece que desea cambiar las imágenes, pero use el mismo comportamiento o agréguelo. El hecho de que todo ese código de comportamiento esté atrapado en el código subyacente y no esté disponible para su reutilización está causando un problema.¿Está familiarizado con los patrones del presentador, como MVVM? –

Respuesta

9

Me gustaría añadir otra contribución que creo que podría ser útil para otros que se encuentran en mi misma situación.

Otra posible solución, que en mi opinión es adecuada si los controles que va a crear no son particularmente complejos, es crear un Control de usuario base que contenga las características comunes que desea compartir: dicho control se escribirá completamente en C#. Esto, de hecho, permite la herencia en los controles de usuario compuestos tanto por XAML como por código. En el XAML del control heredado, en lugar de tener

<UserControl> ... </UserControl> 

Tendrá

<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl> 

y luego en el código detrás de usted también tendrá que especificar lo siguiente:

class MyExtendedControl : MyBaseControl 

Espero que esto ayude.

2

Los controles de usuario no se prestan bien a la herencia en WPF, puede hacer algunos hacks para que funcionen, pero en general probablemente sea mejor utilizar un control personalizado. Es más fácil especificar diferentes XAML para controles heredados usando esta técnica. La forma más fácil de comenzar con un control personalizado es agregar un nuevo elemento a su proyecto de tipo "Control personalizado (WPF)" y agregará el control y el XAML se agregará a Temas/generic.xaml por usted.

Para heredar de este control, la forma más fácil es agregar otro nuevo control personalizado (WPF) y luego cambiar el código para heredar de su control principal en lugar de control.

+0

Entonces, si entiendo correctamente, su sugerencia es que debería tener dos controles personalizados que heredan de un tercero que contiene las características comunes. – Tilvia

+1

Sí, eso es correcto, otra opción si solo tiene algunas características comunes es seguir usando UserControls y usar propiedades o comportamientos adjuntos para las características comunes –

2

Hay varias maneras de dividir las piezas para que sea más fácil trabajar con ellas.

MVVM, como se menciona en un comentario, se basa en la vinculación de datos para separar los controles de entrada de la lógica. Al establecer la clase apropiada que implementa INotifyPropertyChanged en el DataContext de su control, puede cambiar el comportamiento. Su clase DataContext o ViewModel podría implementar las propiedades de Visibilidad para mostrar y ocultar diferentes partes de la entrada si las diferencias no son demasiado grandes entre los usos.

Otra forma de separar la funcionalidad es por agregación. Consulte StackOverflow 269496

Puede crear controles más pequeños que implementen una funcionalidad común y luego crear controles de propósito especial más grandes combinando los controles más pequeños (es decir, agregándolos) para obtener un mayor control. La agregación funcionará tanto para el código subyacente como para los enfoques de enlace de datos.

Cuestiones relacionadas