Question

Une UserControl normale ressemble à ceci en XAML:

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

Je voudrais pouvoir définir mon propre objet de niveau supérieur, le long des lignes de:

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

Où MyControl dérive d'un UserControl lui-même.

Bien sûr, le compilateur se plaint de ne pas « MyControl » être trouvé. Y at-il un moyen de contourner cela?

Était-ce utile?

La solution

La balise racine est la classe de base. Voilà pourquoi la racine de la valeur par défaut est Window1 fenêtre. En utilisant l'option de menu Ajouter> UserContol ... est en fait la création d'une sous-classe pour UserContol.

Si vous avez des éléments communs et que vous voulez une classe de base de commande, vous pouvez utiliser la classe de base comme la balise racine. Vous ne pouvez pas déduire votre classe de toute classe qui a un arbre visuel XAML défini, mais votre classe de base peut dériver de UserConrtol.

Tout d'abord définir votre classe de base:

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

Ensuite, créez votre classe enfant spécifique:

(Vous pouvez commencer par le UserControl1 créé automatiquement et changer à partir de là)

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

Ensuite, changez le côté XAML pour ressembler à ceci:

<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">

Ceci est un excellent moyen de faire des contrôles personnalisés issus de construit dans les autres que UserControl. Il est généralement recommandé d'utiliser simplement UserConrtols de base si vous le pouvez et faire un contrôle personnalisé que si vous devez.

bonne chance,

Autres conseils

Définissez votre espace de noms dans le XAML, puis utilisez votre nom de contrôle comme la balise:

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

    <my:mycontrol ... />

</Window>

Non. Le XAML est un MyControl qui racontèrent visuellement est, tout comme le code-behind est définir ce qu'est un MyControl est du comportement. Définir les visuels d'un MyControl en termes d'un MyControl ne pas vraiment de sens. Il est l'équivalent de, dans le code-behind, dérivant MyControl de MyControl, que vous ne feriez pas évidemment

En outre, WPF ne vous laissez pas dérivez une classe UserControl d'un autre exemple si BobsControl est un UserControl alors vous ne pouvez pas écrire <local:BobsControl x:Class="MyNamespace.MyControl... /> non plus. Je crois que c'est parce que UserControls ont un aspect visuel (contenu) cuit au four dans leur XAML et le contenu de la classe dérivée devrait remplacer le contenu de la classe de base, de sorte que l'héritage visuel est généralement pas utile.

Cependant, vous peut le faire si l'élément de niveau supérieur vous est un dérivé de sur mesure contrôle. Les contrôles personnalisés sont lookless (non définis dans le XAML). Donc, vous peut créer votre propre élément de niveau supérieur comme un contrôle personnalisé, et d'en tirer ensuite des contrôles « utilisateur » de cela. (Si vous allez dans cette voie, vous aurez probablement envie de tirer votre contrôle personnalisé de ContentControl ou d'appliquer ContentPropertyAttribute, de sorte que votre élément de niveau supérieur peut facilement contenir d'autres XAML.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top