Was ist der Unterschied zwischen einer Benutzersteuerungsbibliothek und einer benutzerdefinierten Steuerungsbibliothek?

168

Ich bin gerade mit WPF auf dem Laufenden und möchte ein wiederverwendbares WPF-Steuerelement erstellen.

Wenn ich mir die Optionen zum Erstellen von Projekten in Visual Studio ansehe, werden "WPF User Control Library" und "WPF Custom Control Library" angezeigt. Mir ist nicht klar, was der Unterschied zwischen ihnen ist, und meine Google-Suche hat keine anständigen Erklärungen ergeben.

Ich möchte die Unterschiede zwischen ihnen verstehen und im Idealfall einige Beispiele dafür sehen, wann man sie übereinander verwendet.

17 von 26
quelle
2
Vergessen Sie nicht, Inhalte zu verschachteln oder die Vorlage eines Steuerelements als Optionen zu ändern. Auf diese Weise können Sie ziemlich dramatische Änderungen an einem Steuerelement vornehmen, ohne ein benutzerdefiniertes Steuerelement schreiben zu müssen.
MichaC
Genau das, was MichaC gesagt hat. Das Beste an WPF ist, dass die Vorlage vorhandener Steuerelemente enorme Auswirkungen haben kann. Sie sollten selten benutzerdefinierte Steuerelemente benötigen. Dies ist anders als bei WinForms, wo bereits geringfügige Änderungen an einem Steuerelement ein neues abgeleitetes Steuerelement erfordern.
Mikko Rantanen
Immer noch nützlich. Habe noch ein goldenes Abzeichen.
Ouflak

Antworten:

117

In der Praxis implementieren Sie benutzerdefinierte Steuerelemente auf Codeebene, während Sie XAML für Benutzersteuerelemente verwenden können. Die benutzerdefinierten Steuerelemente erweitern eine der Basisklassen der WPF-Steuerelemente und bieten zusätzliche Funktionen durch Code, sodass die gesamte hinzugefügte Logik und Darstellung im Code implementiert werden muss.

Ein Benutzersteuerelement ist technisch gesehen ein normales Inhaltssteuerelement, das Sie an einigen Stellen im Code erweitern können. In der Regel wird es jedoch erweitert, indem andere Steuerelemente darin platziert werden. Wie Kent bereits erwähnt hat, ist ein UserControl eine Ansammlung anderer Steuerelemente. Dies schränkt die Möglichkeiten einer Benutzersteuerung erheblich ein. Es ist einfacher zu verwenden, aber eingeschränkter als ein vollständiges benutzerdefiniertes Steuerelement.

Diese Steuerelemente unterscheiden sich aus Sicht der Laufzeit geringfügig. Wenn Sie eine Anwendung erstellen und ein UserControl darin platzieren, enthält die Steuerungsstruktur eine konkrete UserControl-Vorlage. Wenn wir also ein lahmes Beispiel für einen speziellen Knopf betrachten. Wenn Sie ein Benutzersteuerelement verwenden, fügen Sie dem <UserControl>Element eine Schaltfläche hinzu . Wenn Sie ein benutzerdefiniertes Steuerelement verwenden, leiten Sie das Steuerelement höchstwahrscheinlich von einer Schaltfläche ab. Der Unterschied wäre im logischen Baum sichtbar.

Während das benutzerdefinierte Steuerelement einen logischen Baum ähnlich wie bereitstellen würde

  • Fenster
    • CustomButton

Das UserControl würde einen logischen Baum von geben

  • Fenster
    • CustomButtonUserControl
      • Taste

Am Ende ist das UserControl also nur ein normales ContentControl, das Sie ein wenig erweitern und für das Sie den Inhalt vordefinieren können. Die benutzerdefinierte Steuerung bietet eine größere Flexibilität zum Preis einer einfachen Implementierung, da Sie die gesamte Logik und Interaktion im Code ausführen müssen, anstatt den Vorteil von XAML zu nutzen.

Nach all dem glaube ich nicht, dass es so viele Unterschiede in den Visual Studio-Vorlagen gibt. Höchstwahrscheinlich erstellt das benutzerdefinierte Visual Studio-Steuerelement nur ein Projekt mit einem leeren benutzerdefinierten Steuerelement, während das Benutzersteuerelementprojekt ein Projekt mit einem leeren Benutzersteuerelement ist. Sie können dem Projekt später beliebige Elemente hinzufügen.

Aktualisieren

Meiner Meinung nach sollten Sie ein Benutzersteuerelement verwenden, wenn Sie mit einem Benutzersteuerelement etwas erledigen können und das zusätzliche Steuerelement im logischen Baum Sie nicht stört. Verwenden Sie ein Benutzersteuerelement, da diese so viel einfacher zu handhaben sind erstellen und pflegen. Verwenden Sie ein benutzerdefiniertes Steuerelement nur, wenn Sie einen Grund haben, kein Benutzersteuerelement zu verwenden.

Mikko Rantanen
quelle
2
Kann ein benutzerdefiniertes Steuerelement verwendet werden, um andere Steuerelemente zu aggregieren?
17 von 26
Und was ist mit dem Skinnable / Templatable-Problem?
17 von 26
1
Nicht sicher, was Sie unter Aggregation verstehen. Sie können kein benutzerdefiniertes Steuerelement erstellen, indem Sie andere Steuerelemente zusammenfassen. Sie können jedoch von einem Panel-Steuerelement wie StackPanel, Grid oder Panel selbst ableiten, um einen Layout-Container mit einem benutzerdefinierten Steuerelement zu implementieren (Sie sind sich nicht sicher, ob Sie dies mit einem Benutzersteuerelement tun können).
Mikko Rantanen
Ja, aber wenn Sie nur andere Steuerelemente zusammenfassen möchten, ist es wahrscheinlich viel einfacher, ein Benutzersteuerelement zu verwenden. Je nachdem, was Sie tun möchten, kann es sehr schwierig sein, ein benutzerdefiniertes Steuerelement zu schreiben. Aus diesem Grund würden Sie ein Benutzersteuerelement verwenden, obwohl es nur einen Teil der Funktionen bietet.
MichaC
1
Beide Steuerelemente sollten bei korrekter Implementierung skinnbar / templatierbar sein. Leider befindet sich meine WPF-Referenz derzeit im Büro, sodass ich die Implementierungsdetails nicht überprüfen kann.
Mikko Rantanen
23

A steht Controlfür ein Verhalten, das skinnbar (templatbar) ist, während a UserControlim Allgemeinen eine übergeordnete Aggregation von Controls ist, die für eine Anwendung spezifisch ist.

Weitere Infos hier .

Kent Boogaart
quelle
3
Das ist einer der Links, die ich gefunden habe und die die Dinge nicht sehr gut erklärt haben :). Ich denke, eine Sache, die mir fehlt, ist, was Skinnable / Templatable wirklich bedeutet und warum dies mit einem Benutzersteuerelement nicht möglich ist. Außerdem lautet der letzte Satz des verlinkten Beitrags "Im Allgemeinen und einfach gesagt, haben benutzerdefinierte Steuerelemente eine bessere Flexibilität und Wiederverwendbarkeit als Benutzersteuerelemente". Wenn das stimmt, warum sollte ich dann jemals ein Benutzersteuerelement erstellen wollen?
17 von 26