Frage

Ich habe zusammen eine Vorlage in Expression Blend für eine Schaltfläche geworfen, und es funktioniert gut - bis ich Vorsprung über ihn und drückt die Leertaste. Ich erhalte die folgende Fehlermeldung:

InvalidOperationException '[Unknown] Eigenschaft verweist nicht auf eine DependencyObject im Pfad '(0). (1). [0]. (2)'.

Der Code lautet wie folgt:

    <ControlTemplate x:Key="EmailButton" TargetType="{x:Type Button}">
        <ControlTemplate.Resources>
            <Storyboard x:Key="MouseOverStoryboard">
                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                    <SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FF55679E"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
            <Storyboard x:Key="UnMouseOverStoryboard">
                <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                    <SplineColorKeyFrame KeyTime="00:00:00.4000000" Value="#FF92A2D3"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </ControlTemplate.Resources>
        <Border x:Name="border" BorderBrush="#FF000000" BorderThickness="2,2,2,2" CornerRadius="4,4,4,4">
            <Border.Background>
                <LinearGradientBrush EndPoint="0.47,-0.01" StartPoint="0.47,0.808">
                    <GradientStop Color="#FF92A2D3" Offset="0"/>
                    <GradientStop Color="#FFFFFFFF" Offset="1"/>
                </LinearGradientBrush>
            </Border.Background>
            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Background" TargetName="border" Value="#FF92A2D3"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Trigger.EnterActions>
                    <BeginStoryboard x:Name="MouseOverStoryboard_BeginStoryboard" Storyboard="{StaticResource MouseOverStoryboard}"/>
                </Trigger.EnterActions>
                <Trigger.ExitActions>
                    <BeginStoryboard x:Name="UnMouseOverStoryboard_BeginStoryboard" Storyboard="{StaticResource UnMouseOverStoryboard}"/>
                </Trigger.ExitActions>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

Es würde scheinen, wie entweder die MouseOverStoryboard oder UnMouseOverStoryboard gefeuert werden (Der Pfad in dem Fehler erwähnt scheint die Target entsprechen). Ich bin mir nicht sicher, warum entweder würde ausgelöst, wenn die Leer obwohl drücken ... Irgendwelche Vorschläge?

EDIT: Dank Ryan Versaw, habe ich versucht, die folgende, die nun Leerklick aus werfen die Ausnahme verhindert:

            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Background" TargetName="border">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF92A2D3" Offset="0"/>
                            <GradientStop Color="#FF92A2D3" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
            </Trigger>

Nun ist der Bürstentyp bleibt konsistent (LinearGradientBrush), und es gibt immer 0. GradientStop zur Verfügung.

Ich bin immer noch neugierig auf einer anderen Sache - was der ist am besten Weg, um dies zu, dass angesichts diese sorta fühlt sich an wie ein Hack (ex: ein dritte Gradient Anschlag hinzugefügt / animiert, dann muss ein drittes GradientStop hinzugefügt werden, wenn IsPressed == True).

Danke für die Vorschläge! Hoffentlich wird dies jemand anderes helfen, auch.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, was die optimale Lösung wäre, aber ich fand eine, die funktioniert.

Erstellen Sie eine LinearGradientBrush in Ihren Ressourcen:

<LinearGradientBrush x:Key="solidBrush">
    <GradientStop Color="#FF92A2D3"/>
</LinearGradientBrush>

Ändern Sie Ihre IsPressed Trigger auf die folgenden (nur die Value Änderungen):

<Trigger Property="IsPressed" Value="True">
    <Setter Property="Background" TargetName="border" Value="{StaticResource solidBrush}"/>
</Trigger>

Dies sollte den gesamten Hintergrund für eine neue Swap (der auch ein LinearGradientBrush ist).

Andere Tipps

Wenn Sie die Leertaste drücken ist wie die Schaltfläche klicken.
Sie sollten bei der IsPressed Auslöser aussehen

Es sieht aus wie Ihre IsPressed Auslöser der Setter versucht, einen Farbwert (# FF92A2D3) an die Background-Eigenschaft Ihrer Grenze zuzuweisen. Allerdings enthält der Hintergrund Eigentum Ihrer Grenze eines linearen Gradienten Pinsel, kein Fest Farbe Pinsel. Das ist nur ein erster Blick Meinung, though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top