2009-05-19 11 views
1

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.

Antwort

1

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

ein LinearGradientBrush in Ihren Ressourcen erstellen:

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

ändern 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 einen neuen tauschen (das ist auch ein LinearGradientBrush).

+0

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. –

1

Wenn Sie die Leertaste drücken, ist wie das Klicken auf die Schaltfläche.
Sie sollten am IsPressed Auslöser aussehen

1

Es ist wie Ihr IsPressed Auslöser der Setter sieht versucht, einen Farbwert (# FF92A2D3) an die Background-Eigenschaft Ihrer Grenze zuzuweisen. Die Hintergrundeigenschaft Ihres Rahmens enthält jedoch einen linearen Verlaufsbürsten und keinen Volltonfarbenpinsel. Das ist jedoch nur eine erste Meinung.