custom control wpf xaml user-controls

custom control wpf



¿Cuál es el propósito de un UserControl? (4)

El propósito de un UserControl es agrupar un conjunto de controles en uno componente reutilizable. No se pueden peinar ni modelar.

El propósito de un Custom Control es extender un control existente o crear un control completamente nuevo. Estos, a diferencia de UserControl se pueden diseñar y modelar.

Creo que te estás confundiendo con los dos.

Entonces, se estará preguntando: "¿Cuándo debería usar un UserControl y cuándo debería usar un Custom Control ?" y la respuesta a eso es que depende.

Debe usar un UserControl cuando necesite crear un grupo lógico de controles que interactúen de alguna manera para crear un control casi compuesto . Debe usar un Custom Control cuando desee agregar funcionalidad a un control existente.

En su ejemplo, su mejor enfoque sería utilizar un UserControl , ya que su StackPanel es un grupo de controles integrados en un componente reutilizable.

Puedes encontrar un poco más aquí , y aquí .

¿Por qué realmente necesitamos un control de usuario?

Ventana:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication1="clr-namespace:WpfApplication1"> <wpfApplication1:SaveCloseUserControl /> </Window>

Control de usuario:

<UserControl x:Class="WpfApplication1.SaveCloseUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel Orientation="Horizontal"> <Button Height="30" Content="Save" /> <Button Height="30" Margin="1" Content="Cancel" /> </StackPanel> </UserControl>

Código detrás:

public partial class SaveCloseUserControl : UserControl { public SaveCloseUserControl() { InitializeComponent(); } }

No veo ningún motivo por el que deba envolver un StackPanel (o cualquier otro control) dentro de un UserControl, si el siguiente código sin UserControl hará exactamente lo mismo.

Ventana:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication1="clr-namespace:WpfApplication1"> <wpfApplication1:SaveCloseStackPanel /> </Window>

Panel de pila sin control del usuario:

<StackPanel x:Class="WpfApplication1.SaveCloseUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Orientation="Horizontal"> <Button Height="30" Content="Save" /> <Button Height="30" Margin="1" Content="Cancel" /> </StackPanel>

Código detrás:

public partial class SaveCloseUserControl : StackPanel { public SaveCloseUserControl() { InitializeComponent(); } }

He estado usando UserControls en todas partes, pero ahora, cuando lo pienso, no hacen nada aparte de envolver un elemento en él. Así que lo probé en 10 vistas diferentes, y no importa de qué se trata, pude reemplazar el UserControl con otros elementos (Grid, ComboBox, GroupBox, etc.), y todo funciona exactamente de la misma manera. Entonces, para ser claros, si tenía un control de usuario y lo primero era ComboBox, eliminé UserControl y puse ComboBox en su lugar. Todo dentro permaneció tal como estaba, al igual que en el ejemplo anterior con StackPanel.

¿Por qué debería molestarme con UserControl y tener otro elemento para crear y representar si no hace nada?


El objetivo de UserControl es ayudarlo a crear componentes de UI reutilizables que se pueden agregar a su caja de herramientas como un control incorporado, comenzando desde la nada. El prefijo "Usuario" aquí significa "No del equipo de WPF". WPF no envía ninguna clase derivada de UserControl .

Un aspecto muy importante de UserControls es que puede diseñarlos usando XAML (para que puedan ser compuestos) y empaquetar código + XAML juntos, posiblemente en un ensamblado de "biblioteca" que puede enviar sin la fuente.

Ahora, tus ejemplos son bastante anémicos (sin ofender :-), no hacen nada tan interesante que me sentiría tentado de hacerlos realmente reutilizables. La mayoría de las veces, creará UserControls a partir del uso (o experiencia), después de haberse dado cuenta de que ha repetido el mismo patrón XAML más de una vez, quizás con algunas variaciones.

Por ejemplo, en este proyecto de código abierto (Github para Visual Studio): https://github.com/github/VisualStudio/tree/master/src/GitHub.UI/Controls , verás que han escrito algunos controles personalizados, como EmojiImage (que se deriva de Image, y no necesita XAML), y un UserControl: HorizontalShadowDivider. ¿Por qué? Debido a que HorizontalShadowDivider tiene asociado XAML y es (probablemente) utilizado en más de un lugar.


He leído en algún lugar de un libro (lo siento, olvidé el título del libro ...) que UserControl es un contenedor de "caja de bloque".

Según entiendo el término y StackPanel usando su ejemplo como base, puede ver que el derivado de StackPanel está limitado a la capacidad de StackPanel para diseñar los dos botones, que es Horizontal o Vertical. En el futuro, si este diseño cambia (tal vez un nuevo requisito?) Tendrá que crear una nueva clase derivada del panel (o reescribir la existente) y usarla, digamos un DockPanel. Esto es malo.

Mientras esté en el derivado de UserControl , todo lo que tiene que hacer es cambiar el StackPanel a otro tipo de panel que se adapte al nuevo requisito.

Eso hace que UserControl sea un bloque de bloque, en mi humilde opinión.


Según su ejemplo, si usa el control de usuario solo una vez, entonces no es tan útil. Pero en tales escenarios, si alguna parte del diseño se usa tantas veces y cada vez que se escribe un código xaml o cualquier otra lógica para crear la misma IU, entonces el control del usuario llega a la jugada.