head.WriteLine()

Montag, Mai 23, 2011

TT.UIA: Behavior Factories

Wie hier bereits beschrieben, haben Expression Blend Behaviors ein paar Limitationen. Hierzu zählt zum Beispiel die Tatsache, dass sie nicht per Style zugewiesen werden können. Um diese Limitation zu umgehen, bietet TT.UIA die Behavior Factories.

Die Klasse BehaviorFactory

Behaviors werden zwar auch über Attached Properties zugewiesen, können aber nicht über einen Style zugewiesen werden. Dies ist per Design so und führt bei jedem Versuch zu einer Exception. Behaviors lassen sich jedoch per Code zuweisen. Diese Möglichkeit nutzt die Klasse BehaviorFactory. Sie stellt die Attached Property BehaviorTypeName zu Verfügung, über die die Typbezeichnung des Behaviors angegeben werden kann. Der so angegebene Behavior-Typ wird daraufhin instanziiert und per Code an das entsprechende Element gebunden.
In folgendem Beispiel wird das Focus Behavior mit Hilfe von BehaviorFactory innerhalb eines Styles zugewiesen:
<Window>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="behaviors:BehaviorFactory.BehaviorTypeName" Value="Thinktecture.UIAnnotations.Behaviors.FocusBehavior" />
</Style>
</Window.Resources>
...
</Window>

Da der Style implizit definiert wurde, werden daraufhin alle Textboxen des Fensters mit dem Behavior ausgestattet, ohne das diese explizit zugewiesen werden müssen.
In diesem Fall kann es jedoch vorkommen, das eine bestimmte Textbox des Fensters nicht mit dem Behavior ausgestattet werden soll. Hierfür bietet BehaviorFactory die Attached Property DetachBehaviorTypeName. Sie unterbindet für das zugehörige Element ist Zuweisung des über einen Style definierten Behaviors.
<TextBox
behaviors:BehaviorFactory.DetachBehaviorTypeName=
"Thinktecture.UIAnnotations.Behaviors.FocusBehavior" />

TriggerActionFactory und TargetedTriggerActionFactory

Wenn das betreffende Behavior nicht von Behavior<T>, sondern von TriggerAction<T> oder TargetedTriggerAction<T> ableitet, muss zusätzlich noch der Name des auslösenden Events, bzw. das Zielelement angegeben werden. Hierfür bietet TT.UIA die spezialisierten Klassen TriggerActionFactory und TargetedTriggerActionFactory.
Im nächsten Post geht es ebenfalls um Behaviors. Hier werde ich die Klasse AdornerFactoryBehavior vorstellen, die verwendet werden kann, um beliebige Adorner per Behavior zuzuweisen.

Labels:

7 Comments:

  • Dieser Kommentar wurde vom Autor entfernt.

    By Blogger TheCondor, at September 21, 2011 3:41 PM  

  • It is possible in this WPF snippet:

    Setter Property="behaviors:BehaviorFactory.BehaviorTypeName" Value="Thinktecture.UIAnnotations.Behaviors.FocusBehavior"

    to set another color for the FocusBehaviour?

    By Blogger TheCondor, at September 21, 2011 3:43 PM  

  • You can't set properties of the behaviors directly via BehaviorFactory. Try to declare the FocusBehavior as a resource, then configure it and reference it in the BehaviorFactory.

    By Blogger Jörg Neumann, at September 22, 2011 9:50 AM  

  • Hi,

    you mean so?

    <behaviors:FocusBehavior x:Key="MyBehaviour" HighlightBrush="Aqua"
    />

    <Style TargetType="dxe:TextEdit">
    <Setter Property="behaviors:BehaviorFactory.BehaviorTypeName" Value="{StaticResource MyBehaviour}" />
    </Style>

    By Blogger TheCondor, at September 22, 2011 10:49 AM  

  • yes, exactly.

    By Blogger Jörg Neumann, at September 22, 2011 10:59 AM  

  • Hello,

    unfortunately does not work. The xaml-editor accept this values. I have debugging this and the resource will be instantiated correctly. But the color I set (aqua) will not be used. Any idea why?

    Best Regards

    A.

    By Blogger TheCondor, at September 22, 2011 7:34 PM  

  • Sorry, that doesn't work. As a workaround, change the color directly in the FocusBehavior. I'm working on parametized BehaviorFactory for the next version.

    By Blogger Jörg Neumann, at September 23, 2011 9:11 AM  

Kommentar veröffentlichen

<< Home