2016-03-31 2 views
0

をストーリーボードWPFでカスタムボタンテンプレートの集中/不履行ボタングロー効果をトリガーする適切な方法は何ですか?これは、Windows 7のボタングローとWindows 8/10の太い輪郭のフォーカスとデフォルトのボタンの動作が似ています。トリガとIsDefaultedとIsKeyboardFocusedボタンの入口/出口アクションは

(注:Windows 7のバニラWPFのプロジェクトは、ああ、マイクロソフトのオペレーティングシステムの他の部分に存在する集中/不履行ボタングロー...示さない) :

を私はこれを試してみました

<MultiTrigger> 
    <MultiTrigger.Conditions> 
     <Condition Property="IsDefaulted" Value="False" /> 
     <Condition Property="IsKeyboardFocused" Value="False" /> 
    </MultiTrigger.Conditions> 
    <MultiTrigger.EnterActions> 
     <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" /> 
    </MultiTrigger.EnterActions> 
    <MultiTrigger.ExitActions> 
     <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </MultiTrigger.ExitActions> 
</MultiTrigger> 

動作が期待通りのようですが、それは警告の多く生成 - 彼らは画面上にロードされているとして、ボタンごとに警告を。

System.Windows.Media.Animation警告:6:指定されたストーリーボードがこのオブジェクトにインタラクティブコントロールとして適用されていないため、アクションを実行できませんでした。アクション= '削除';ストーリーボード= 'System.Windows.Media.Animation.Storyboard'; Storyboard.HashCode = '16952812'; Storyboard.Type = 'System.Windows.Media.Animation.Storyboard'; TargetElement = 'System.Windows.Controls.Button:保存'; TargetElement.HashCode = '37829947';のみフォーカスを失ったときものの - - TargetElement.Typeは=「System.Windows.Controls.Button」

マイやや冗長な解決策は、まだ警告を生成し、期待どおりに動作しません:に既定のボタンからタブ移動するとき別のボタンを押すと、デフォルトのボタンが点灯し続けます。

<Trigger Property="IsDefaulted" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 
<Trigger Property="IsKeyboardFocused" Value="True"> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsFocusedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsFocusedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 

解決策#1を使用して警告を無視しても問題ありません。これを行うためのより良い方法は何ですか?

ストーリーボードはエキサイティングなものではありません:

<Storyboard x:Key="IsDefaultedStoryboard" RepeatBehavior="Forever"> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="IsDefaulted" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.8" Value="0" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:2.0" Value="1" /> 
     <EasingDoubleKeyFrame KeyTime="0:0:4.0" Value="0" /> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 
+0

? –

+0

@GordonAllocman私は基本的にあなたが集中も債務不履行もないなら、あなたは何のストーリーボードを持つべきではないと言ってるので。あなたが集中したりデフォルト設定している場合、我々は、グローストーリーボードを開始しなければならない(すなわち、MultiTriggerは、もはやその条件のすべてを満たしていません)。私は論理が健全だと思うが、まだ作成されていないストーリーボードを削除するのは間違いだ。 – Guttsy

+0

最初のエラー(警告6)は、Gordonが暗示しているとおりです。まだ始まっていないストーリーボードを削除しようとしているからです。私は実際に記憶をチェックするためのより良い方法を見つけ出していません。 – Logan

答えて

0

私はストーリーボードの同一のコピーを作成することになった2つの別々のトリガーを通してそれを適用し、

<Trigger Property="IsDefaulted" Value="True"> 
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" /> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsDefaultedStoryboard" Storyboard="{StaticResource IsDefaultedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsDefaultedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 
<Trigger Property="IsKeyboardFocused" Value="True"> 
    <Setter TargetName="buttonStroke" Property="Opacity" Value=".5" /> 
    <Trigger.EnterActions> 
     <BeginStoryboard x:Name="IsKeyboardFocusedStoryboard" Storyboard="{StaticResource IsKeyboardFocusedStoryboard}" /> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <RemoveStoryboard BeginStoryboardName="IsKeyboardFocusedStoryboard" /> 
    </Trigger.ExitActions> 
</Trigger> 

つまり、私は重複を好きではありませんしかし、それは警告を生成せず、期待どおりに動作します。あなたが入力した上で削除し、終了時にbeginstoryboardを使用している理由コードの最初の部分で