Silverlight

Dinge, die man mit einem Rebuild erreichen kann

Hiermit möchte ich gerne eine neue Kategorie eröffnen: Nervige Zeitfresser, die man einfach durch ein Rebuild lösen kann ;-) Diese Liste soll eine dezente Erinnerung an alle verzweifelte Entwickler da draußen sein, ab und zu einfach mal ein Rebuild zu machen.

Silverlight

Dinge, die man mit einem Rebuild erreichen kann

Hiermit möchte ich gerne eine neue Kategorie eröffnen: Nervige Zeitfresser, die man einfach durch ein Rebuild lösen kann ;-) Diese Liste soll eine dezente Erinnerung an alle verzweifelte Entwickler da draußen sein, ab und zu einfach mal ein Rebuild zu machen. Manche Fehler lösen sich dadurch vielleicht in Luft auf: - Implizite Styles in Silverlight: Nachdem ich gefühlte 3h den Fehler in allen möglichen Resourcen und Verknüfungen gesucht habe, half ein einfacher Rebuild und 'Tataa', alle ScrollViewer (und alle anderen Controls) zogen sich auf ein mal den impliziten Style, den ich definiert hatte! ... to be continued ... PS: Falls ihr auch ähnliche Beispiele habt, lasst es mich wissen, ich werde die Liste dann aktualisieren.


Silverlight

IsEnabled überschreiben

Ausgangslage:

Ich habe ein CustomControl (z.B. abgeleitet von ContentControl), dass aus mehreren weiteren Elementen (z.B. einem Button) besteht.

Ziel:

Wenn ich bei meinem CustomControl "IsEnabled = false" setze, dann soll nur der Inhalt des Controls disabled werden, nicht jedoch das gesamte Control und damit auch der Button.

Silverlight

IsEnabled überschreiben

Ausgangslage:

Ich habe ein CustomControl (z.B. abgeleitet von ContentControl), dass aus mehreren weiteren Elementen (z.B. einem Button) besteht.

Ziel:

Wenn ich bei meinem CustomControl "IsEnabled = false" setze, dann soll nur der Inhalt des Controls disabled werden, nicht jedoch das gesamte Control und damit auch der Button.

Problem:

Die Property IsEnabled wird an die Kinder vererbt (bzw. die Kinder erben vom Parent) und damit wird auch automatisch der Button im Template disabled. Es gibt zwar ein IsEnabledChanged Event, allerdings kann man dort nicht so etwas sagen wie "IsHandled = true".

Lösung:

Es gibt allerdings einen kleinen Trick und zwar kann man wie folgt die DependencyProperty überschreiben: Wichtig dabei ist das "new" Keyword bei der DependencyProperty und dem Property Wrapper. Außerdem reicht es nicht, nur die Property zu überschreiben, es muss die komplette DependencyProperty sein.


Expression Blend

Mögliche Lösung, wenn Expression Blend Sample Data nicht angezeigt werden...

Ein kleiner Tipp, der mich gerade viel Zeit gekostet hat :-( Wenn SampleData in Blend zur Design-Time angezeigt werden, nicht aber zur Laufzeit, kann sich ein Blick in die XAML-Datei der SampleData im Ordner "SampleData" lohnen. Denn wenn dort Fehler auftreten, kann trotzdem fehlerlos kompiliert werden. Gravierend kann das z.B. der Fall sein, wenn ein Feld-Typ "Image" benutzt wird, der generierte Pfad aber nicht mehr auf eine vorhandene Datei zeigt, weil die Grafik gelöscht wurde beispielsweise...

Expression Blend

Mögliche Lösung, wenn Expression Blend Sample Data nicht angezeigt werden...

Ein kleiner Tipp, der mich gerade viel Zeit gekostet hat :-( Wenn SampleData in Blend zur Design-Time angezeigt werden, nicht aber zur Laufzeit, kann sich ein Blick in die XAML-Datei der SampleData im Ordner "SampleData" lohnen. Denn wenn dort Fehler auftreten, kann trotzdem fehlerlos kompiliert werden. Gravierend kann das z.B. der Fall sein, wenn ein Feld-Typ "Image" benutzt wird, der generierte Pfad aber nicht mehr auf eine vorhandene Datei zeigt, weil die Grafik gelöscht wurde beispielsweise...


WPF

CornerRadius eines Borders animieren

Expression Blend generiert bei dem Versuch einen CornerRadius in einem Stordboard zu animieren falschen Code, der sofort in einer Exception "Input string was not in a correct format." resultiert. Fehler-Details und Abhilfe unter https://connect.microsoft.com/Expression/feedback/details/694672/xaml-ge...

WPF

CornerRadius eines Borders animieren

Expression Blend generiert bei dem Versuch einen CornerRadius in einem Stordboard zu animieren falschen Code, der sofort in einer Exception "Input string was not in a correct format." resultiert. Fehler-Details und Abhilfe unter https://connect.microsoft.com/Expression/feedback/details/694672/xaml-ge...


Expression Blend

Unterschiedliche Rundung mit und ohne Stroke

Manchmal gibt es bei abgerundeten Ecken ganz leichte, aber störende Blitzer, denen selbst SnapToDevicePixel nichts anhaben kann. Das liegt daran, dass die Rundung mit und ohne Stroke ein kleines bisschen anders ausfällt... Ohne Stroke auf dem dunklen Hintergrund-Element: Einfach nur gesetzter Stroke auf dem dunklen Hintergrund-Element:

Expression Blend

Unterschiedliche Rundung mit und ohne Stroke

Manchmal gibt es bei abgerundeten Ecken ganz leichte, aber störende Blitzer, denen selbst SnapToDevicePixel nichts anhaben kann. Das liegt daran, dass die Rundung mit und ohne Stroke ein kleines bisschen anders ausfällt... Ohne Stroke auf dem dunklen Hintergrund-Element: Einfach nur gesetzter Stroke auf dem dunklen Hintergrund-Element:


Silverlight

Copy&Paste FAIL: Doppelte Setter im Style

Vielleicht ist es dem einen oder anderen schon passiert: Durch einfaches Kopieren innerhalb von Styles hat man auf ein mal doppelte Setter. Wenn die dann auch nicht direkt untereinander stehen (was der Regelfall sein sollte), kann die Fehlersuche sehr frustrierend sein.

Silverlight

Copy&Paste FAIL: Doppelte Setter im Style

Vielleicht ist es dem einen oder anderen schon passiert: Durch einfaches Kopieren innerhalb von Styles hat man auf ein mal doppelte Setter. Wenn die dann auch nicht direkt untereinander stehen (was der Regelfall sein sollte), kann die Fehlersuche sehr frustrierend sein. Ich möchte daher kurz die Problematik schildern, um so vielleicht den ein oder anderen Frust-Moment zu vermeiden ;-) Die Ausgangslage soll folgendes Bild verdeutlichen: Wie man sieht, lässt es WPF (und auch Silverlight) zu, doppelte Setter im Style zu verwenden, ohne eine Fehlermeldung zur Design- / Laufzeit zu schmeißen. Das Verhalten ist dadurch allerdings nicht mehr eindeutig korrekt. Zur Laufzeit (und im Designer) überschreibt der letzte Setter den Wert der Property. Wenn man nun aber z.B. über Blend die Property ändert, so ändert Blend den Wert des ersten Setters, was augenscheinlich keine Auswirkungen auf das Ergebnis hat. Die Verwirrung ist umso größer, wenn in diesem Fall über Blend eine Resource an die Property gebunden wird. Blend zeigt nun einen gelben Rahmen um die Property (was bedeutet, dass diese gebunden ist), allerdings hat das keine Auswirkungen auf das Ergebnis, weder im Designer, noch zur Laufzeit. FAZIT: Steht man mal wieder vor dem Rätsel, warum ein Binding in einem Style nicht funktioniert, einfach mal im XAML Code runterscrollen und überprüfen, ob es einen doppelten Setter gibt ;-) UPDATE: In Silverlight bekommt man zumindest eine Fehlermeldung in Blend, wenn man versucht den Style erneut zu öffnen. Allerdings lässt sich das Projekt trotzdem kompilieren und ausführen (mit dem gleichen Ergebnis, wie oben beschrieben).


Silverlight

Blendable SharedResourceDictionary

Die Idee und Implementierung eines SharedResourceDictionary ist schon einige Tage alt und von Christian Moser auch gut umgesetzt worden (siehe hier http://www.wpftutorial.net/MergedDictionaryPerformance.html). Dennoch hat bisher keiner der Kommentatoren oder der Autor selbst eine Antwort darauf geliefert, wie man das SharedResourceDictionary auch in Blend nutzbar machen kann.

Silverlight

Blendable SharedResourceDictionary

Die Idee und Implementierung eines SharedResourceDictionary ist schon einige Tage alt und von Christian Moser auch gut umgesetzt worden (siehe hier http://www.wpftutorial.net/MergedDictionaryPerformance.html). Dennoch hat bisher keiner der Kommentatoren oder der Autor selbst eine Antwort darauf geliefert, wie man das SharedResourceDictionary auch in Blend nutzbar machen kann. Die aktuelle Implementierung des SharedResourceDictionary wirft zur Designzeit von Blend entsprechende Fehler, auch wenn diese nur sichtbar werden wenn man sich aus dem Visual Studio heraus an Blend attached und debugged. Diese Fehler führen dazu, dass keine der über SharedResourceDictionary definierten Ressourcen in Blend zur Verfügung steht. Die Lösung des Problem ist jedoch sehr simpel. Die Verwendung wird von Christian Moser so beispielhaft erläutert:

<ResourceDictionary.MergedDictionaries>
   <SharedResourceDictionary Source="/MyControlLibrary;component/Themes/Brushes.xaml"  />
</ResourceDictionary.MergedDictionaries>

Hierbei fällt auf, dass nur das ResourceDictionary in der Collection der MergedDictionaries ein SharedResourceDictionary ist und genau hier liegt auch das Problem. Um die Struktur sauber zu nutzen und damit auch in Blend nutzbar zu machen, muss das ResourceDictionary, welches eine MergedDictionaries Collection beinhaltet, ebenfalls durch ein SharedResourceDictionary ersetzt werden:

<SharedResourceDictionary>
   <SharedResourceDictionary.MergedDictionaries>
      <SharedResourceDictionary Source="/MyControlLibrary;component/Themes/Brushes.xaml"  />
   </SharedResourceDictionary.MergedDictionaries>
</SharedResourceDictionary>

Silverlight

Fokus bei TabItems

Um programmatisch den Fokus auf ein TabItem zu setzen, reicht es nicht aus, "IsSelected" auf true und die Methode "Focus()" des TabItems aufzurufen. Hier ist ein Weg, der funktioniert: 1. Über das TabControl gehen und "tabControl.SelectedItem = tabItem" setzen. 2. "UpdateLayout()" des TabControls aufrufen. Nur dann erhält das selektierte TabItem (und damit der Inhalt) den Fokus.

Silverlight

Fokus bei TabItems

Um programmatisch den Fokus auf ein TabItem zu setzen, reicht es nicht aus, "IsSelected" auf true und die Methode "Focus()" des TabItems aufzurufen. Hier ist ein Weg, der funktioniert: 1. Über das TabControl gehen und "tabControl.SelectedItem = tabItem" setzen. 2. "UpdateLayout()" des TabControls aufrufen. Nur dann erhält das selektierte TabItem (und damit der Inhalt) den Fokus.


Silverlight

Text Trimming in Silverlight und WPF

Etwas versteckt (und daher vielleicht auch nicht so bekannt) ist die Funktion des Text Trimming's in Silverlight und WPF. Ohne großen Aufwand kann so zu langer Text in einem TextBlock abgeschnitten und durch 3 Punkte abgekürzt werden.

Silverlight

Text Trimming in Silverlight und WPF

Etwas versteckt (und daher vielleicht auch nicht so bekannt) ist die Funktion des Text Trimming's in Silverlight und WPF. Ohne großen Aufwand kann so zu langer Text in einem TextBlock abgeschnitten und durch 3 Punkte abgekürzt werden. Hier ein Beispiel dazu: Text hat genug Platz und wird nicht abgeschnitten: Control ist zu klein für den Text (WordEllipsis): Nur WPF: (CharacterEllipsis): Dieses Verhalten lässt sich durch die "TextTrimming" Property des TextBlocks steuern. In WPF hat man darüber hinaus noch die Möglichkeit "CharacterEllipsis" auszuwählen, was dazu führt, dass WPF auch mitten in einem Wort abschneidet. ACHTUNG: Um dieses Text Trimming zu erhalten, muss darauf geachtet werden, dass die "TextWrapping" Property des TextBlocks auf "NoWrap" steht!


WPF

Snippet für DependencyProperty mit OnChange

Nichts wildes, aber weil ich es nach jedem Rechner aufsetzen suche, hier mal online dokumentiert: Mein Snippet für DependencyProperty mit OnChangeCallBack.

WPF

Snippet für DependencyProperty mit OnChange

Nichts wildes, aber weil ich es nach jedem Rechner aufsetzen suche, hier mal online dokumentiert: Mein Snippet für DependencyProperty mit OnChangeCallBack.