Zusammen mit André, haben wir vor etwas längerer Zeit einen Vortrag zum Thema WPF Custom Control Development ausgestaltet. Wir hielten den Vortrag auf einigen Konferenzen und .NET UserGroups!
Der Vortrag zeigt zunächst, wie man abstrakt bei der Entwicklung neuer Controls vorgehen kann. Als Ausgangspunkt sollte eine kleine Analyse dienen. Ziel der Analyse ist die Klärung der Schnittstellen des Controls d.h. welche Properties, Events usw. angeboten werden. Danach thematisiert der Vortrag die Frage, wann überhaupt ein Custom Control sinnvoll ist. WPF bietet u.a. mit Styles und Templates unglaubliche Möglichkeiten und der Zeitpunkt zur Erstellung eines eigenes Custom Controls verzögert sich aus der technischen Perspektive stark. Demgegenüber stehen jedoch Überlegungen, ob das Control gerade für einen Prototyp oder realen Produktiv-Code implementiert wird. Für einen Wegwerf-Prototyp darf es gerne quick and dirty sein. Anschließend zeigt der Vortrag einige der handwerkliche Techniken u.a. Custom Control Library, Routed Events, Dependency Properties, Routed Commands, und OnApplyTemplate Methode. Diese Techniken werden anhand einer einfacheren SearchTextBox und eines komplexen PointCharts (Graphen) veranschaulicht.
Im Anschluss wird das Thema Blendability angesprochen und die wichtigsten Attribute vorgestellt.
Ich beschäftige mich schon wirklich lange mit der WPF und gegenwärtigen UI Frameworks. Nach wie vor fasziniert mich die Architektur der WPF unheimlich und aus meiner Sicht gibt es kein UI Framework, welches auch im Hinblick auf Custom Control Development so eine logische und ausgeklügelte Basis bietet! Wer einmal allgemeines Wissen über Control-Bau gelernt hat und sich danach die Techniken der WPF aneignet, wird die WPF lieben.
Karlsruher Entwicklertag 2016: CodedUI - Richtig vorbereitet ist halb getestet!
WPF Custom Control Development Unchained
1. WPF CUSTOM CONTROL DEVELOPMENT UNCHAINED
David C. Thömmes
Senior Software Engineer
Lead Software Engineering Standards
thoemmes@ergosign.de
Ergosign GmbH
6. CUSTOM CONTROL ANALYSE
3
Identifikation
Standard UI Elemente
Custom Controls
Anforderungsanalyse pro Custom Control
Funktionale Anforderungen, Properties, Events, ....
Abstraktes Vorgehen
Design
Anforderungen
UI
Development
Analyse
Abstraktion
7. CUSTOM CONTROL ANALYSE
3
Identifikation
Standard UI Elemente
Custom Controls
Anforderungsanalyse pro Custom Control
Funktionale Anforderungen, Properties, Events, ....
Abstraktes Vorgehen
Design
Anforderungen
Develop
UI
Development
Analyse
Abstraktion
9. CUSTOM CONTROLS?
Eigentlich “nur”
Ableitung von einer konkreten Klasse != UserControl
Styling- und Template- Möglichkeiten
Visueller Aufbau im Control Template
Default Style möglich Generic.xaml
Zusammenfassung in einer Control Library möglich
5
10. Besteht i.d.R aus Klasse, Style, Template
Verwaltung in Custom Control Library (VS Projektvorlage)
Kann beliebe Custom Controls & Ressourcen enthalten
DefaultStyle wird nach Konvention in “Themes/Generic.xaml”
deklariert
Mapping im statischen Konstruktor des Controls
(DefaultStyleKeyProperty.OverrideMetadata)
CUSTOM CONTROLS?
Custom Control Library
6
20. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
21. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
22. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
Styling & Templating?
23. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
Styling & Templating?
ValueConverter/Markup
Extensions?
24. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
Styling & Templating?
ValueConverter/Markup
Extensions?
Attached Properties/Behaviors?
25. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
Styling & Templating?
ValueConverter/Markup
Extensions?
Attached Properties/Behaviors?
Drittanbieter?
26. WANN IST EIN CUSTOM CONTROL SINNVOLL?
15
WPF Standard Control?
WPF Standard Controls
gruppieren?
Styling & Templating?
ValueConverter/Markup
Extensions?
Attached Properties/Behaviors?
Drittanbieter?
My Custom Controlvs.
27. Prototyp vs. Produktiv Code
Wiederverwendbarkeit
Konsistenz im User Interface
Produktivität bei großen Projekten
WANN IST EIN CUSTOM CONTROL SINNVOLL?
Allgemeine Überlegungen
16
29. WANN IST EIN CUSTOM CONTROL SINNVOLL?
Die Ausrüstung!
18
Loaded/Unloaded
Routed
Commands
Custom
ControlDependency
Properties
Blendability
Attribute
Overrid
e
Style, Template &
TemplateBinding
OnApplyTemplate
Routed Events
Custom Control
Library &
Generic.xaml
49. Oberflächlich wie .NET Properties (Get, Set)
Unterschied liegt in der Implementierung
Ausschließliche Verwendung bei Controls
Metadaten und Speicherperformance,
Änderungsbenachrichtigungen Grundlage für Trigger, Data
Binding, Animationen etc.
SEARCHTEXTBOX
Dependency Properties - Basics
30
50. > Registrieren über Statische Funktion
> Name
> Typ
> Control Typ bzw. Klasse
> Metadaten
Properties anlegen 1/2
(SearchTextBox.cs)
31
53. RoutedCommand Klasse implementiert ICommand
Löst eine Aktion innerhalb eines Controls aus und muss
abonniert werden
Verknüpfung mit Methode oder Funktion der Control Klasse
per CommandBinding
Kann über Command Property ausgelöst werden
SEARCHTEXTBOX
RoutedCommands
34
120. Logic (C#, Klasse) und Visualisierung (Xaml, Template)
getrennt
Elemente innerhalb Control Template werden nach
Konvention mit PART_... benannt
Element-Referenzierung über OnApplyTemplate() Methode
GetTemplateChild() Methode mit PART_... aufrufen
Achtung: Element müssen nicht in der Template vorhanden
sein
POINTCHART
OnApplyTemplate()
66
124. POINTCHART
OnApplyTemplate() - Tipps
70
Nur verwenden wenn Template Binding, RoutedCommands
oder RoutedEvents nicht zu dem gewünschten Ergebnis
führen
NullReferenceException vermeiden und defensiv
programmieren
OnApplyTemplate() Methode kann mehrfach aufgerufen
werden, mit internen Properties arbeiten (Mehr Kontrolle)
OnApplyTemplate() Methode kann manuell aufgerufen
werden. Dadurch wird Control Template geladen
128. Reagieren auf Änderungen über Changed Callback möglich
Angabe einer statischen Funktion. Über das Metadatenobjekt
innerhalb der Funktion erhält man Zugriff auf die Instanz des
Controls sowie Informationen über Änderungen
(ChangedEventArgs)
Statische Methoden möglichst kurz halten und auf der
Instanz eine Methode aufrufen
POINTCHART
Dependency Properties - Extended 1/2
74
130. Doch was wenn bereits existierende Properties Elemente
beeinflussen?
Hier:
Width, Height
Items
Lösung: Überschreiben bereits vorhandener Methoden oder
Properties
Dependency Properties - Extended 2/2
76
POINTCHART
137. RoutedEvents können je nach Strategy im visuellen Baum
hoch oder hinunter navigieren.
Somit können Sie mehrere Handler auf verschiedenen
Elementen auslösen
Strategien:
Tunneling = Down
Bubbling = Up
Direct = Direct (Vergleiche standard .NET Events)
RoutedEvents
83
POINTCHART
148. Xaml friendly und Blend kompatibel
Default Property Values, Styles und Templates
Zusätzliche Ressourcen als Properties
Keine tiefe Verschachtelung der Templates
Mode Properties für Trigger
Design Time Features verwenden
...
BLENDABILITY
Blendability
93
164. FAZIT
Fazit
WPF bietet die optimale Basis für Custom Control Development
Custom Controls sinnvoll einsetzen
Sorgen für mehr Konsistenz (Bausteine)
Erhöhen die Produktivität (Implementierung, Blendability)
Leben Sie einen benutzerzentrierten Designprozess!
107