Ich habe eine Vorlage in Expression Blend für eine Schaltfläche zusammengewürfelt, und es funktioniert gut - bis ich über sie hinweg und drücken Sie die Leertaste. Ich erhalte folgende Fehlermeldung:WPF: Button ControlTemplate + Leertaste = Ausnahme?
InvalidOperationException Die Eigenschaft '[Unknown]' zeigt nicht auf ein DependencyObject im Pfad '(0). (1). [0]. (2)'.
Der Code ist 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 wird gefeuert (Der Pfad in dem Fehler erwähnt scheint die Target entsprechen). Ich bin mir nicht sicher, warum beide feuern würden, wenn ich die Leertaste drücke ... Irgendwelche Vorschläge?
EDIT: Dank Ryan Versaw, ich folgendes versucht, 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>
die Bürsten Jetzt bleibt konsistent (LinearGradientBrush), und es gibt immer 0. GradientStop verfügbar.
Ich bin immer noch neugierig auf einer anderen Sache - was das ist beste Weg, um dies zu, wenn man bedenkt, dass diese sorta wie ein Hack fühlt (ex: ein dritte Gradient Anschlag hinzugefügt/animiert, dann ein drittes GradientStop muss hinzugefügt werden, wenn IsPressed == True).
Danke für die Vorschläge! Hoffentlich hilft das auch anderen.
Um etwas gut zu machen, habe ich versucht, den Hintergrund mit Phninsteins Antwort mit einem ähnlichen Pinsel zu vertauschen. Andere Wege mögen funktionieren, aber das hat für mich funktioniert. –