wpf user-controls wpf-controls custom-controls viewmodel

wpf - Control personalizado vs usuario



user-controls wpf-controls (8)

(Perdón por publicar como respuesta, no puedo hacer ningún comentario. Si le resulta útil, siéntase libre de agregar esto como comentario a, por ejemplo, la respuesta de Benjamin?)

Fácilmente puede diseñar Visualmente CustomControl . Crear nuevo UserControl (o Ventana). Cree su estructura xaml visualmente en Designer. Copie y pegue el cuerpo del xaml resultante dentro de ControlTemplate de su nuevo CustomControl (por ejemplo, en el archivo de tema genérico).

Si recuerdo bien, también puedes diseñar visualmente la plantilla CustomControl directamente, en Blend.

Por supuesto, también puede instanciar el wip de CustomControl en una ventana y colocar la vista Designer de la ventana como un nuevo panel sobre la vista xaml del control en VisualStudio. Algunos enlaces xaml de la plantilla de estilo no se muestran en Designer de esta manera, hasta que vuelva a compilar.

[Imho GUI es principalmente una cuestión visual y no debe, y no necesita, ser creado en código. ]

He estado leyendo algunas explicaciones sobre la diferencia entre el usuario y los controles personalizados, por ejemplo esto: http://www.wpftutorial.net/CustomVsUserControl.html

Quiero crear, por ejemplo, una composición simple de una cuadrícula de datos con 2 cuadros combinados que son responsables de cambiar los valores de los elementos de la cuadrícula de datos. Quiero crear un control específico para esto porque lo voy a usar muchas veces. Me gustaría implementar la lógica detrás y luego en la invocación xaml solo tengo que especificar los itemsSource.

Para este ejemplo, ¿debo crear un usuario o un control personalizado? Como tendré propiedades y lógica, ¿debería tener un modelo de vista para este control?

EDITAR: ¿Conoces algunos artículos con clara separación conceptual entre estas 2 opciones?


Bueno, para crear un control personalizado, necesita implementarlo como control de usuario. Su propio control de usuario se llama control personalizado. Es bastante simple.

UserControl es la clase base para contener su contenido personalizado:

<UserControl> Your custom WPF content </UserControl>

No estoy totalmente de acuerdo con el artículo. Sin embargo, en su caso necesita un UserControl que puede volver a utilizar en su UI.


La elección no es solo entre control de usuario y control personalizado, sino también entre control de usuario, control personalizado, personalización de plantilla de control, personalización de plantilla de datos, plantilla de encabezado (para controles basados ​​en recopilación), propiedades adjuntas. Consulte la descripción de Control Authoring

Voy por el siguiente orden de consideración

  1. Propiedades adjuntas : si se puede lograr la funcionalidad, uso propiedades adjuntas. Ejemplo, cuadro de texto numérico.

  2. Plantilla de control : cuando el requisito se puede cumplir personalizando la plantilla de control, uso esto. Ejemplo, barra de progreso circular.

  3. Control personalizado : si la plantilla de control no puede hacerlo, utilizo control personalizado. Siempre que necesite personalizar / extender el control ya presente. Ejemplo que proporciona clasificación, filtrado basado en la fila de encabezado en GridView (GridView está presente en las aplicaciones de metro, se utiliza solo para ilustrar el ejemplo)

  4. Control de usuario : menos preferido. Solo cuando se requiere composición, y no puedo hacerlo usando control personalizado. Como en tu ejemplo, 2 Combobox y 1 datagrid. Los controles de usuario no proporcionan una característica sin formato perfecta que puede aprovecharse a través de una plantilla de control o control personalizada.


La mejor explicación está en el msdn . CustomControl es más un nombre "virtual", no hay una clase llamada "CustomControl" en WPF, sino que crea una nueva clase sobre una de las clases de control de WPF, como Control , ItemsControl e incluso controles más específicos como TextBox o Button .

Para su caso específico, un UserControl debería ser suficiente, crear un CustomControl es algo que puede evitarse fácilmente. Si bien no es algo malo, mucha gente, especialmente los principiantes en WPF provenientes de WinForms, tienden a subclasificar más de lo necesario.


Si de alguna manera es la primera vez que construye controles, recomiendo UserControl ya que VS le permite diseñar su interfaz más fácilmente. Los controles personalizados son más potentes, pero tienes que separar CLARAMENTE la lógica de tu control de su interfaz y esto requiere un poco más de preparación.


Siempre puede confiar en las descripciones de estilo microsoft autoexplicativas:

Control de usuario (WPF) - Control de usuario de Windows Presentation Foundation
Control personalizado (WPF) - Control personalizado de Windows Presentation Foundation


Ya tiene algunas excelentes respuestas que explican las diferencias, pero también comprende que los controles personalizados y UserControls tienen diferentes propósitos:

Un UserControl generalmente encapsula algún tipo de comportamiento compuesto. Si tiene una aplicación que necesita editar detalles de contacto en muchos lugares, por ejemplo, puede crear un control personalizado que tenga las etiquetas y campos de texto para todos los datos con un botón de envío que tenga el código correspondiente y reutilizar este control a lo largo de su aplicación.

Un control personalizado es un control que se deriva de una de las clases de control de WPF (EG Control , ContentControl , etc.) y debe crearse en código. Estos controles generalmente tienen un único propósito cohesivo (piense en TextBox , ComboBox , Label ) en lugar de actuar juntos como un todo (aunque esto no tiene que ser el caso).

UserControl es generalmente más fácil para las personas que no están familiarizadas con WPF ya que pueden diseñarse visualmente.

Mi sugerencia sería comenzar con un UserControl . Siempre puede refactorizar esto en un control personalizado en una fecha posterior a medida que se familiarice con la forma en que funciona WPF . La creación de su control como un control personalizado requerirá el conocimiento de ControlTemplate y Style s, ya que tendrá que proporcionar el suyo para definir una apariencia para su control.

Cuando todo está dicho y hecho, mientras el control se comporte correctamente, no importa qué enfoque use.

Consulte this publicación para ver un ejemplo de dos enfoques para el mismo problema. El autor del post quería un control que puede presentar contenido modal frente al contenido principal. El autor del mensaje en realidad respondió su propia pregunta implementándola como UserControl . He agregado una respuesta a la publicación que crea el control como control personalizado pero ambos tienen el mismo efecto final.


  • Si tiene un modelo de vista y desea crear una vista para él, use el Control de usuario .

  • Si necesita un control autónomo que no tenga un modelo de vista específico,
    probablemente necesites un control personalizado .

  • Si encuentra que la funcionalidad que necesita como un todo, ya existe en otros controles, debe anular una plantilla de control existente.
    (es decir: para un botón con forma de diamante, debe anular la plantilla de control del botón).

  • Con respecto a las propiedades adjuntas y los comportamientos adjuntos, son útiles cuando tiene un control que desea extender con más propiedades o desea que se comporte ligeramente diferente de su comportamiento predeterminado.

En el caso provisto de la composición descrita por OP, se puede lograr con control de usuario o control personalizado. Preferiría un control personalizado ya que no se proporciona un modelo de vista específico, la "entrada" es solo una propiedad vinculada a una colección de elementos.

Ah, y, lo siento por llegar un poco tarde.