Frage

Ein normales Usercontrol sieht wie folgt in XAML:

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

Ich möchte in der Lage sein, mein eigenes Top-Level-Objekt zu definieren, entlang der Linien von:

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

Wo MyControl leitet sich von einem Usercontrol selbst.

Natürlich ist der Compiler beschwert sich über „MyControl“ nicht gefunden wird. Gibt es eine Möglichkeit, um dieses?

War es hilfreich?

Lösung

Der Root-Tag ist die Basisklasse. Deshalb ist die Wurzel des Standard Window1 ist Window. Über den Menüpunkt Hinzufügen> UserContol ... ist in der Tat eine Unterklasse für UserContol zu schaffen.

Wenn Sie haben einige gemeinsame Elemente und wollen eine Steuerbasisklasse können Sie die Basisklasse als Root-Tag verwenden. Sie können Ihre Klasse von jeder Klasse nicht ableiten, die eine XAML definierte visuelle Struktur hat, aber Ihre Basisklasse aus UserConrtol ableiten.

Zuerst definieren Sie Ihre Basisklasse:

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

Dann spezifisches Kind Klasse erstellen:

(Sie können mit dem automatisch erstellten UserControl1 beginnen und von dort aus)

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

Dann XAML-Seite wie diese Aussehen:

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

Dies ist eine gute Möglichkeit, benutzerdefinierte Steuerelemente von gebaut in denen andere, dass Usercontrol abgeleitet zu machen. Es wird in der Regel empfohlen, nur grundlegende UserConrtols verwenden, wenn Sie können und eine individuelle Steuerung machen nur, wenn Sie müssen.

Glück,

Andere Tipps

Definieren Sie Ihren Namensraum in der XAML und dann Steuernamen als Tag verwenden:

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

    <my:mycontrol ... />

</Window>

Nein. Die XAML wird erklärt, was ein MyControl visuell ist, ebenso wie der Code-behind ist zu definieren, was ein MyControl verhaltensorientierten ist. Definieren der Grafik eines MyControl im Sinne einer MyControl nicht wirklich Sinn machen würde. Es ist das Äquivalent in der Code-behind, MyControl von MyControl ableiten, die Sie würde natürlich nicht tun

Darüber hinaus ist WPF lassen Sie nicht eine Usercontrol-Klasse von einem anderen zum Beispiel ableiten wenn BobsControl ein Benutzersteuerelement ist, dann können Sie nicht schreiben <local:BobsControl x:Class="MyNamespace.MyControl... /> entweder. Ich glaube, das liegt daran, dass Benutzersteuerelemente ein visuelles Erscheinungsbild (Inhalt) gebacken in ihre XAML und den Inhalt der abgeleiteten Klasse würde den Inhalt der Basisklasse ersetzen, so dass die visuelle Erbe der Regel nicht sinnvoll ist.

Allerdings Sie können tun es, wenn die Top-Level-Element, das Sie aus abzuleiten sind eine benutzerdefinierte Kontrolle. Benutzerdefinierte Steuerelemente sind lookless (nicht in XAML definiert). So Sie können erstellen Sie Ihre eigene Top-Level-Element als eine benutzerdefinierte Steuerung und dann ableiten „user“ Kontrollen aus, dass. (Wenn Sie diesen Weg gehen nach unten zu tun, werden Sie wahrscheinlich wollen Ihre individuelle Kontrolle von Content abzuleiten oder Content anwenden, so dass Ihr Top-Level-Element leicht anderen XAML enthalten.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top