Silverlight 3: Pixel-Shader
Pixel-Shader sind kompilierte Softwareanweisungen, die die Farbe der Pixel berechnen. Die Berechnung findet auf der GPU statt. Die Anweisungen sind in HLSL (High Level Shader Language) geschrieben. Pixel-Shader ermöglichen die Entwicklung von benutzerdefinierten Effekten. Alle Elemente, die von UIElement abgeleitet werden, haben das Effect-Property, das das Rendern vom Element mit dem angebundenen Pixel-Shader ermöglicht. Ab Silverlight 3 sind zwei integrierte Pixel-Shader enthalten: Blur und Drop Shadow. Beide Effekte können in der System.Windows.Media.Effects-Bibliothek gefunden werden. Listing 1 demonstriert die Deklaration im XAML und Abbildung 1 verdeutlicht das Ergebnis.
Listing 1: Der DropShadowEffect unter Silverlight

WPF: Data Binding besser debuggen
Wenn beim Data Binding etwas nicht stimmt, wird im Hintergrund eine Exception ausgelöst. Diese wird allerdings nur im Output-Fenster beim Debuggen sichtbar. Die Informationen sind mit einer Zeile sehr knapp gehalten und bei User Controls anderer Hersteller oft undurchschaubar. Mit einem kleinen Trick wird der Sache nachgeholfen. Mithilfe der Klasse System.Diagnostics.PresentationTraceSources kann man sich mehrere Infos zum Binding anzeigen lassen. Diese wird als Attached-Property beim Data Binding deklariert (Listing 2). Als TraceLevel-Optionen stehen Low, Medium und High zur Verfügung. Beim Debuggen folgen nun detaillierte Informationen im Output-Window. Ein Beispiel dazu zeigt Listing 3.
Listing 2: PresentationTraceSources für mehr Details beim Data-Binding
Listing 3: Beispielausgabe vom Output-Window beim Debuggen
System.Windows.Data Warning: 54 : Created BindingExpression (hash=59515852) for Binding (hash=42860424) System.Windows.Data Warning: 56 : Path: 'Value.Kennzahl' System.Windows.Data Warning: 58 : BindingExpression (hash=59515852): Default mode resolved to OneWay System.Windows.Data Warning: 59 : BindingExpression (hash=59515852): Default update trigger resolved to PropertyChanged System.Windows.Data Warning: 60 : BindingExpression (hash=59515852): Attach to ....KennzahlUserControl.... (hash=53940693) System.Windows.Data Warning: 65 : BindingExpression (hash=59515852): Resolving source System.Windows.Data Warning: 68 : BindingExpression (hash=59515852): Found data context element:(OK) System.Windows.Data Warning: 70 : RelativeSource.TemplatedParent found CellValuePresenter (hash=64084771) System.Windows.Data Warning: 76 : BindingExpression (hash=59515852): Activate with root item CellValuePresenter (hash=64084771) System.Windows.Data Warning: 105 : BindingExpression (hash=59515852): At level 0 using cached accessor for CellValuePresenter.Value: DependencyProperty(Value) System.Windows.Data Warning: 102 : BindingExpression (hash=59515852): Replace item at level 0 with CellValuePresenter (hash=64084771), using accessor DependencyProperty(Value) System.Windows.Data Warning: 99 : BindingExpression (hash=59515852): GetValue at level 0 from CellValuePresenter (hash=64084771) using DependencyProperty(Value): 'Text' System.Windows.Data Warning: 106 : BindingExpression (hash=59515852): At level 1 - for String.Kennzahl found accessor System.Windows.Data Warning: 106 : BindingExpression (hash=59515852): At level 1 - for EnumerableCollectionView.Kennzahl found accessor
Metro-Style-App: Die MessageBox unter WinRT
Die MessageBox existierte bereits beim klassischen Visual Basic und überlebte bis heute in WPF und Silverlight. Doch unter der Windows Runtime (WinRT) hat sich einiges geändert. Aus der MessageBox wurde ein MessageDialog (Abb. 2). Optisch informiert er den Anwender nun flächendeckend, technisch werden alle zusätzlichen Funktionen via Commands gesteuert und der Dialog wird asynchron ausgeführt. Listing 4 zeigt den Sourcecode für einen Abfragedialog. Wichtig bei der Methodenbeschreibung ist die zusätzliche Deklaration von async. Bei der Instanziierung vom MessageDialog werden der Titel und der Inhalt gesetzt. Für jeden weiteren Button wird ein UICommand zu der Commands-Liste hinzugefügt. Der UICommand erhält ebenfalls eine Instanz von UICommandInvokedHandler. In dessen Konstruktor folgt dann der Text vom Button und ein Delegate. Beim Aufruf von ShowAsync muss vorher mittels await ein Wiedereinstiegspunkt für den asynchronen Vorgang gesetzt werden. Nach der Antwort vom Anwender wird das Delegate gefeuert und dann beim await fortgesetzt.
Listing 4: Der MessageDialog unter WinRT
private async void Button_Click_1(object sender, RoutedEventArgs e) { bool result = false; MessageDialog messageDialog = new MessageDialog("Sind Sie sich sicher?", "Frage"); messageDialog.Commands.Add("OK", new UICommand(new UICommandInvokedHandler(x => result = true))); messageDialog.Commands.Add("Abbrechen", new UICommand(new UICommandInvokedHandler(x => result = false))); await messageDialog.ShowAsync(); if(result) { // OK wurde bestätigt } }
