Dependency Property Value Precedence



  • Hi, ich verstehe gerade nicht warum sich ein Control verhält wie es tut. Und zwar nehme man z.B. die folgende Style Vorlagen für einen ScrollBar:

    https://msdn.microsoft.com/de-de/library/ms742173(v=vs.110).aspx

    und tausche den Style des "ScrollBarThumb" mit dem folgenden:

    <Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}">
                <Setter Property="SnapsToDevicePixels" Value="True"/>
                <Setter Property="OverridesDefaultStyle" Value="True"/>
                <Setter Property="IsTabStop" Value="False"/>
                <Setter Property="Focusable" Value="False"/>
                <Setter Property="Template">                <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Thumb}">
                            <Border
                            x:Name="Border"
                            CornerRadius="4"
                            Background="Red"
                            BorderBrush="Red"
                            BorderThickness="1"/>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsMouseOver" Value="True">
                                    <Setter TargetName="Border" Property="Background" Value="Green"/>
                                    <Setter TargetName="Border" Property="BorderBrush" Value="Green"/>
                                </Trigger>
                                <Trigger Property="IsDragging" Value="True">
                                    <Setter TargetName="Border" Property="Background" Value="Yellow"/>
                                    <Setter TargetName="Border" Property="BorderBrush" Value="Yellow"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    

    Nach meinem bisherigen Verständnis hat ein lokaler Value die höchste Priorität.
    Also hätte ich angenommen, dass der ScrollBarThumb wenn der Mouse-Zeiger über diesem ist oder er gedraggt wird trotz der Trigger für "IsMouseOver" oder "IsDragging" rot bleibt,
    da dem Background und BorderBrush der Border explizit die Farben rot zugewiesen wurden. Tatsächlich werden aber die Trigger angewendet und der Thumb wird grün bzw. gelb.

    Dazu findet sich hier:

    https://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

    folgendes Statement:

    TemplatedParent template properties. An element has a TemplatedParent if it was created as part of a template (a ControlTemplate or DataTemplate). For details on when this applies, see TemplatedParent later in this topic. Within the template, the following precedence applies:

    a) Triggers from the TemplatedParent template.

    b) Property sets (typically through XAML attributes) in the TemplatedParent template.

    Also haben Trigger eines Parent Templates doch eine höhere Priorität als lokale Werte?



  • Das wäre dann scheinbar eine "unschöne" Sonderlocke in der Wert-Evaluation denn es wiederspricht auch den Werten der zugehörigen Enumeration:

    internal enum BaseValueSourceInternal : short
        {
            Unknown                 = 0,
            Default                 = 1,
            Inherited               = 2,
            ThemeStyle              = 3,
            ThemeStyleTrigger       = 4,
            Style                   = 5,
            TemplateTrigger         = 6,
            StyleTrigger            = 7,
            ImplicitReference       = 8,
            ParentTemplate          = 9,
            ParentTemplateTrigger   = 10,
            Local                   = 11,
        }
    

Anmelden zum Antworten