none
WPF Control Template zur Laufzeit wechseln RRS feed

  • Frage

  • Ich hatte hier bereits gefragt wie man das Control Template ändern kann,
    nun wüsste ich gern ob und wenn ja, wie es möglich ist dieses zur Laufzeit vom C#-Code aus zu verändern.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Freitag, 10. Februar 2012 17:32
    Moderator

Antworten

  • Hallo,

    die einfachste Möglichkeit ein Template per Source zu ändern ist es im Style deines Controls auf einen DataTrigger zu reagieren. Im Beispiel unten wird das Template an Hand eines globalen Attached Dependency Properties ausgetauscht. Sobald du das Property per Code änderst, wird in allen Controls der Trigger ausgelöst und das Template gewechselt.

    Man kann Templates auch rein im Code zusammen bauen, das ist jedoch keine besonders erfreuliche Arbeit, daher empfehle ich dir den Weg über den Style deines Controls und die Trigger.

        <Style TargetType="{x:Type local:AButton}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
            <Setter Property="Template" Value="{StaticResource StandardTemplate}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=(UI:Adjustments.Style), RelativeSource={RelativeSource Self}}" Value="Av">
                    <Setter Property="Template" Value="{StaticResource TemplateSmall}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

    Gruss Andreas

    Montag, 13. Februar 2012 14:30

Alle Antworten

  • Hi,

    ich bin nicht ganz sicher, aber wenn die .Net-Programmierer Eigenschaften nicht böswillig irreführend benannt haben, dann wird das Template (deutsch: Vorlage) nur bei der Erzeugung eines Controls verwendet und eine nachträgliche Änderung (im existierenden Objekt) würde zu nichts führen. Die Methode "OnApplyTemplate" wird selbst nach einem Aufruf von "InvalidateVisual" nicht noch einmal durchlaufen.

    Falls es trotzdem einen Grund geben sollte, das Template zu manipulieren, so solltest Du über "<object>.Template.VisualTree" an den Inhalt kommen.

    Gruß
    Jürgen

    Samstag, 11. Februar 2012 18:10
  • Hallo,

    die einfachste Möglichkeit ein Template per Source zu ändern ist es im Style deines Controls auf einen DataTrigger zu reagieren. Im Beispiel unten wird das Template an Hand eines globalen Attached Dependency Properties ausgetauscht. Sobald du das Property per Code änderst, wird in allen Controls der Trigger ausgelöst und das Template gewechselt.

    Man kann Templates auch rein im Code zusammen bauen, das ist jedoch keine besonders erfreuliche Arbeit, daher empfehle ich dir den Weg über den Style deines Controls und die Trigger.

        <Style TargetType="{x:Type local:AButton}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}" />
            <Setter Property="Template" Value="{StaticResource StandardTemplate}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=(UI:Adjustments.Style), RelativeSource={RelativeSource Self}}" Value="Av">
                    <Setter Property="Template" Value="{StaticResource TemplateSmall}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>

    Gruss Andreas

    Montag, 13. Februar 2012 14:30