2009-05-19 10 views
1

ボタン用のExpression Blendでテンプレートを一緒にスローしました。問題なく上に移動してスペースバーを押すまでうまくいきます。WPF:Button ControlTemplate +スペースバー=例外?

InvalidOperationException '[不明]'プロパティは、パス '(0)。(0)。[0]。(2)'のDependencyObjectを指していません。次のように

コードは次のとおりです。

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

MouseOverStoryboardまたはUnMouseOverStoryboardどちらかが発射されているようです(エラーで述べたパスがTargetPropertyに合わせているようだ)と思われます。私はスペースバーを押したときにいずれかがなぜ発火するのかわからない...どんな提案?

EDIT:ライアンVersawへ おかげで、私は今、例外をスローからスペースキークリックを防ぎ、以下を試してみました:

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

今ブラシの種類は(LinearGradientBrush)一貫性のままで、常に0番目ありGradientStopが利用可能です。

私はまだ一つの他の事について好奇心が強い - これはみかんハック(例のように感じていることを考慮すると、これについて行くに最善の方法は何か:第3勾配停止が追加された/アニメーション、第三のGradientStop IsPressed == Trueのときに追加する必要があります)。提案のため

ありがとう!うまくいけば、これは他の人にも役立つでしょう。

答えて

1

私は最適な解決策が何であるかはわかりませんが、動作するものが見つかりました。

あなたのリソースでLinearGradientBrushを作成します。

<LinearGradientBrush x:Key="solidBrush"> 
    <GradientStop Color="#FF92A2D3"/> 
</LinearGradientBrush> 
は、以下の(のみ Value変化)にご IsPressedトリガーを変更

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

これは新しいもののためにあなたの全体の背景を交換する必要があり(これもLinearGradientBrushです)。

+0

私はPwninsteinの答えのために、それが期日になるとクレジットを与えるために、同様のブラシでバックグラウンドを交換しようとしました。他の方法もうまくいくかもしれませんが、これは私にとってはうまくいったのです –

1

スペースバーを押すと、ボタンをクリックするようになります。
あなたのIsPressedトリガーのセッターは、あなたの国境の背景プロパティにカラー値(#FF92A2D3)を割り当てるしようとしているように見えますIsPressedトリガー

1

をご覧ください。ただし、ボーダーの背景プロパティには、ソリッドカラーブラシではなく、リニアグラデーションブラシが含まれています。しかし、それはちょうど一見した意見です。