次のスタイルは意図したとおりに機能します(無関係な小道具は削除されます)。
<Style TargetType="PasswordBox">
<Setter Property="Background">
<Setter.Value>
<VisualBrush>
<VisualBrush.Visual>
<Canvas>
<Path>
<Path.Stroke>
<SolidColorBrush Color="{x:Static SystemColors.HighlightColor}"/>
</Path.Stroke>
</Path>
</Canvas>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.GotFocus">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.Visual.Children[0].Stroke.Color"
To="{x:Static SystemColors.WindowColor}"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
...しかし、これが最善の方法だとは思えません。ここでの醜いことの1つは、ストロークの色に至るまでColorAnimation
長いPropertyPath
トラバースを実行する必要があることです。PasswordBox
このコードを省略または整理する方法はありますか?PropertyPath
トラバーサルが短くなるようにリファクタリングする方法はありますか?
これまで、ストーリーボードをに移動しようとしましたPath.Resources
(ただし、から参照することはできませんでしたStyle.Triggers
)。共有ブラシを入れてStyle.Resources
その色をアニメートします(ただし、スレッド/フリーズ関連の例外が発生します)。