MSDN は、EventTriggerおよび実際にはすべてのカスタム トリガー アクションの使用を推奨していませんが、代わりにStoryBoardおよびVisualStateManagerを提供しています。
Q1. トリガーが非常に便利に見えるのに、なぜ推奨されないのでしょうか?
MSDN の正当な理由は次のようです。
要素での EventTrigger および object.Triggers プロパティ要素の使用は、Silverlight でサポートされていますが、この手法の使用は現在のアプリケーションではお勧めできません。EventTrigger は、Loaded イベントのトリガー アクションのみをサポートできます ( EventTrigger.RoutedEvent プロパティでイベントに名前を付けます) 。
では、VSM の VisualState に名前を付けても問題ありませんが、イベントに名前を付けることは問題ないでしょうか? どちらも変更される可能性のある文字列値ですが、一方の命名が他方より悪いのはなぜでしょうか?
Q2. 値がデータ コンテキストのプロパティ値に依存するオブジェクトのプロパティをアニメーション化するためのベスト プラクティス アプローチは何ですか?
確かに、VSM と StoryBoard はアニメーションには最適ですが、オブジェクトのデータ コンテキストと直接対話することはありませんね。
議論のために次のシナリオを検討してください。
キャンバス パスの境界線は、キャンバスのデータ コンテキストの IsSelected プロパティの値に基づいて色と太さを変更する必要があります。キャンバス パスの囲まれた領域を左クリックすると、IsSelected プロパティが切り替わります。これにより、パスのアニメーションも変更され、最終的には色と太さが変更されます。
アプローチ1
おそらく、対話イベント (つまり、MouseLeftButtonUp) にフックして、コード ビハインドで IsSelected プロパティ値を更新し、StoryBoard を開始するか、VisualState を変更してキャンバス パスをアニメーション化することができます。これはアニメーションの観点からは問題ないかもしれませんが、データ コンテキストを IIsSelectable インターフェイスにキャストしない限り、ビューをそのビュー モデル/データ コンテキストに強く結び付けます。
アプローチ 2
おそらく、IISelectable (上記) プロパティを切り替えて、StoryBoard を開始するか、VisualState を変更する動作を作成できます。Canvas は Control であるため、StoryBoard だけでなく VSM を使用することをお勧めします (そうしないと、StoryBoard への参照を Behavior に渡さなければならないのではないでしょうか?)。
アプローチ 3
キャンバス パスの初期アニメーションが IsSelected プロパティ値によって決定されるように、デュアル コンバーターで双方向バインディングを使用することもできますが、ユーザーの操作によってアニメーション / VisualState が変更され、IsSelected プロパティ値が更新されます。この場合、Canvas Path の境界線の色/太さのプロパティを変換しますか、または VisualState を (IsSelected のブール値との間で) 適切に変換する方法はありますか?
これらは、頭の中で思いついたアイデアのほんの一部です。より良いプラクティスとなる他の提案はありますか?