2009-07-15 19 views
37

Ich habe vor kurzem ein Usercontrol, die eine ziemlich lange gedauert, weil ich mit benutzerdefinierten Abhängigkeitseigenschaften und so weiter ... SowiesoWPF Control vs Usercontrol

arbeiten musste, war es nur ein Haufen von 3 Steuerelementen: TextBox, Popup mit hierarchischem Baum.

Jetzt erkannte ich, ich könnte wahrscheinlich nur ein ControlTemplate schreiben. Was ist also der Vorteil der Verwendung von UserControl?

Antwort

54

Hier sind drei Fälle zu berücksichtigen: UserControl, ControlTemplate und benutzerdefinierte Control. (Ich vermute, braucht eine Datatemplate keine Erklärung)

A individuelle Steuerung ist etwas, das Sie zur Verfügung stellen, wenn Sie die Basisfunktionalität eines neuen UI-Komponente erstellen. Es gibt verschiedene Vor- und Nachteile für dieses Beispiel. Wenn Sie jedoch ein benutzerdefiniertes Auswahlverhalten für ein ItemsControl wünschen, können Sie dies am besten tun, indem Sie Selector oder MultiSelector ableiten (das tut wfftoolkit DataGrid). Wenn Sie ein Objekt wünschen, das eine neue DependencyProperty enthalten würde, werden Sie in den meisten Fällen von Control abgeleitet. Das WPF-Prinzip, das hier enthalten ist, ist das "lookless" -Steuerparadigma, oder "stellen Sie sicher, dass Sie jemanden erwarten, der Ihr Controlboard templatiert, oder sorgen Sie dafür, dass es sich in Ihrem eigenen Template-Szenario gut verhält". Benutzerdefinierte Steuerelemente werden in der Regel unter Berücksichtigung von Wiederverwendbarkeit erstellt, oft als Teile von Framework-DLLs.

A ControlTemplate ist im Wesentlichen eine Beschreibung eines visuellen Ersatzbaums und kann entweder explizit auf FrameworkElements oder als Teil eines Styles festgelegt werden. Dies ist die Option, die Sie anstreben sollten, wenn Ihr Ziel in erster Linie darin besteht, eine Bewerbung zu machen und damit fertig zu werden. Sie können fast alles mit einer ControlTemplate visuell machen, wenn Sie die Bindungen und Trigger (und die mögliche Aufnahme von Style selbst) in Ordnung bringen können. All dies kann als eine wiederverwendete Ressource deklariert werden, um Ihrer Anwendung ein gemeinsames "Thema" zu geben.

A UserControl ist ein in sich geschlossenes Composite-Steuerelement, dessen Teile im Designer einzeln editierbar sind. Es wird am besten verwendet, wenn Sie Ihre Komponenten sehen und im Designer verwalten müssen.Ein ControlTemplate hingegen wird seine Komponenten im Designer nicht für Manipulationen zugänglich machen (obwohl es sichtbar sein wird). In der Regel erstellen Sie ein Benutzersteuerelement für eine Kundendetailseite oder einen Produktanzeigebrowser oder einen Fall, in dem Sie keine vollständige Kontrolle erstellen, sondern eine detaillierte Ansicht mit vollständiger Designerunterstützung wünschen.

Ein besonderer Fall ist hier, wenn Sie das Muster MVVM verwenden. Viele große MVVM-Implementierungen verwenden UserControls als Ansichten und ControlTemplates und Stile als Ressourcen, die von diesen Ansichten verwendet werden. Die MVVM-Praxis minimiert zudem die Notwendigkeit eines benutzerdefinierten Controls und bietet viele weitere Vorteile.

(Für weitere Informationen über MVVM, unter vielen anderen, Google für Josh Smith, Sacha Barber und Karl Shifflett fantastischen Artikel)

3

Wenn Sie eigene Abhängigkeitseigenschaften hinzufügen, benötigen Sie eine eigene Klasse, um sie zu definieren.

Da Sie eine Vorlage auf die Klasse anwenden möchten, muss diese benutzerdefinierte Klasse von Control (wie UserControl) abgeleitet werden.

Der Hauptvorteil des Schreibens Ihrer eigenen Klasse Control ist, dass die Vorlage für andere Verwendungsszenarien neu definiert werden kann, entweder von Ihnen innerhalb der App oder von anderen Benutzern dieses Typs.

In der Klasse UserControl ist nur ein geringer Overhead vorhanden. Wenn Sie es in Reflector.NET betrachten, werden Sie feststellen, dass es kaum Code gibt. In erster Linie UserControl definiert nur die Metadaten auf einigen bestehenden Abhängigkeitseigenschaften (wie den Standardwert von FocusablePropertyfalse machen.)

Es sei denn, Sie die Vorlage der Steuerung sofort neu zu definieren müssen, können Sie es als UserControl für jetzt verlassen und ändern Sie es später, wenn nötig.

+0

ich es verstehe, dass der primäre Unterschied ist, dass ich für das Steuerelement neue Abhängigkeitseigenschaften bieten kann. Aber ich denke, dass alle anderen Änderungen in Style, Triggers oder Template gesetzt werden können. Oder? –