¿Cuál es la diferencia entre una biblioteca de control de usuario y una biblioteca de control personalizada?

168

Estoy llegando a la velocidad de WPF y me gustaría crear un control WPF reutilizable.

Cuando miro las opciones para crear proyectos en Visual Studio, veo "Biblioteca de control de usuario de WPF" y "Biblioteca de control personalizado de WPF". No me queda claro cuál es la diferencia entre ellos y mis búsquedas en Google no han dado ninguna explicación decente.

Me gustaría entender las diferencias entre ellos e idealmente ver algunos ejemplos de cuándo usar uno sobre el otro.

17 de 26
fuente
2
No olvide anidar contenido o cambiar la plantilla de un control como opciones. Puede realizar cambios bastante dramáticos en un control de esta manera sin tener que escribir un control personalizado.
MichaC
Justo lo que dijo MichaC. La mejor parte de WPF es que la creación de plantillas de los controles existentes puede tener un gran impacto. Debe requerir controles personalizados rara vez. Esto es diferente a WinForms donde incluso cambios menores en un control requieren un nuevo control derivado.
Mikko Rantanen el
Sigue siendo útil Tener otra insignia de oro.
ouflak

Respuestas:

117

En la práctica, los controles personalizados son algo que implementa en el nivel de código, mientras que puede usar XAML para los controles de usuario. Los controles personalizados extienden una de las clases base de control de WPF y proporcionan funcionalidad adicional a través del código, por lo que toda la lógica y representación agregadas deben implementarse dentro del código.

Un control de usuario es técnicamente un control de contenido normal que puede extender en algunas partes del código, pero generalmente se extiende colocando otros controles dentro de él. Entonces, como Kent mencionó, un UserControl es una agregación de otros controles. Esto limita considerablemente lo que puede hacer con un control de usuario. Es más fácil de usar pero más limitado que un control personalizado completo.

Estos controles tienen una pequeña diferencia desde el punto de vista del tiempo de ejecución. Al construir una aplicación y colocar un UserControl en ella, el árbol de control tendrá una plantilla concreta de UserControl dentro de ella. Entonces, si consideramos un ejemplo poco convincente de un botón especializado. Si estuviera utilizando un control de usuario, agregaría un botón dentro del <UserControl>elemento. Al usar un control personalizado, lo más probable es que derive el control de un botón. La diferencia sería visible en el árbol lógico.

Mientras que el control personalizado proporcionaría un árbol lógico similar a

  • Ventana
    • CustomButton

El UserControl daría un árbol lógico de

  • Ventana
    • CustomButtonUserControl
      • Botón

Entonces, al final, el UserControl es solo un ContentControl normal que puede extender un poco y para el que puede predefinir el contenido. El control personalizado proporciona una mayor flexibilidad al precio de la facilidad de implementación, ya que tiene que hacer toda la lógica e interacción en el código en lugar de tener el beneficio de XAML.

Aunque después de todo esto, no creo que haya tanta diferencia en las plantillas de Visual Studio. Lo más probable es que el Control personalizado de Visual Studio solo cree un proyecto con un control personalizado vacío, mientras que el proyecto de Control de usuario es un proyecto con un control de usuario vacío. Más tarde puede agregar cualquier tipo de elementos al proyecto.

Actualizar

Y mi opinión sobre cuándo usar el control personalizado y el control de usuario es que si puede hacer algo con un control de usuario y el elemento de control adicional en el árbol lógico no le molesta, use un control de usuario, ya que es mucho más fácil crear y mantener Use un control personalizado solo si tiene una razón para no usar un control de usuario.

Mikko Rantanen
fuente
2
¿Se puede usar un control personalizado para agregar otros controles?
17 de 26
¿Y qué pasa con el tema de skinnable / templatable?
17 de 26
1
No estoy seguro de lo que quieres decir con agregación. No puede crear un control personalizado agregando otros controles. Sin embargo, puede derivar de un control de Panel como StackPanel, Grid o Panel en sí mismo para poder implementar un contenedor de diseño con un control personalizado (No estoy seguro si puede hacerlo con un Control de usuario).
Mikko Rantanen el
Sí, pero si solo desea agregar otros controles, probablemente sería mucho más fácil hacerlo con un Control de usuario. Dependiendo de lo que desee hacer, un control personalizado puede ser realmente difícil de escribir, por lo que elegiría usar un Control de usuario a pesar de que solo proporciona un subconjunto de las capacidades.
MichaC
1
Ambos controles deben ser personalizables / templables cuando se implementan de la manera correcta. Desafortunadamente, mi referencia de WPF está en la oficina actualmente, así que no puedo verificar los detalles de implementación.
Mikko Rantanen el
23

A Controlrepresenta un comportamiento que es personalizable (templable), mientras que a UserControles generalmente una agregación de nivel superior de Controls que es específica de una aplicación.

Más información disponible aquí .

Kent Boogaart
fuente
3
Ese es uno de los enlaces que encontré que no explicaba las cosas muy bien :). Supongo que una cosa que me falta es lo que realmente significa skinnable / templatable y por qué no se puede hacer con un control de usuario. Además, la última oración de la publicación vinculada es "En términos generales y simples, los controles personalizados tienen una mayor flexibilidad y reutilización que los controles de usuario". Si eso es cierto, ¿por qué querría crear un control de usuario?
17 de 26