Pregunta

Un control de usuario normal, es la siguiente con XAML:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

Me gustaría ser capaz de definir mi propio objeto de nivel superior, a lo largo de las líneas de:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

Cuando MyControl deriva de un mismo control de usuario.

Por supuesto, el compilador se queja de "MyControl" no ser encontrado. ¿Hay una manera de evitar esto?

¿Fue útil?

Solución

La etiqueta raíz es la clase base. Es por eso que la raíz del defecto es Window1 ventana. El uso de la opción de menú Agregar> UserContol ... es, de hecho, la creación de una sub-clase de UserContol.

Si usted tiene algunos elementos comunes y desea que una clase base de control se puede utilizar la clase base como la etiqueta raíz. No se puede concluir cuál es su clase de cualquier clase que tiene un árbol visual xaml definido, pero su clase base puede derivar de UserConrtol.

En primer lugar definir la clase de base:

public class MyControlBase : UserControl
{
    // ...
}

A continuación, crear la clase de niño específico:

(Puede comenzar con el UserControl1 creado de forma automática y cambiarlo desde allí)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

A continuación, cambiar el lado Xaml a tener este aspecto:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

Esta es una gran manera de hacer controles personalizados derivados de construida en los otros que UserControl. Por lo general se recomienda utilizar sólo UserConrtols básicos si se puede y hacer un control personalizado sólo si es necesario.

buena suerte,

Otros consejos

Definir el espacio de nombres en el XAML y luego utilizar su nombre como el control de la etiqueta:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

No. El XAML está declarando lo que un MyControl visualmente es, al igual que el código subyacente es definir qué es un MyControl conductualmente es. Definición de los elementos visuales de una MyControl en términos de una MyControl no sería realmente tener sentido:. Que es el equivalente, en el código subyacente, que se deriva de MyControl MyControl, que es obvio que no lo haría

Además, WPF no permite que usted deriva una clase UserControl de otro, por ejemplo, Si BobsControl es un control de usuario a continuación, no se puede escribir <local:BobsControl x:Class="MyNamespace.MyControl... /> tampoco. Creo que esto es porque UserControls tienen una apariencia visual (contenido) al horno en su XAML y el contenido de la clase derivada tendría que reemplazar el contenido de la clase base, por lo que la herencia visual es generalmente no es útil.

Sin embargo, puede hacerlo si el elemento de nivel superior que está derivado de un costumbre de control. Los controles personalizados son lookless (no definido en XAML). Por lo que puede crear su propio elemento de nivel superior como un control personalizado, y luego derivar los controles de "usuario" de eso. (Si lo hace ir por este camino, es probable que desea derivar el control personalizado de ContentControl o aplicar ContentPropertyAttribute, de modo que su elemento de nivel superior puede contener fácilmente otra XAML.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top