2

私は、WPF/WP7 Silverlight でアタッチされたビヘイビアーについて学ぼうとしていますが、誰かが検討できるかどうか疑問に思った概念的な障害に直面しました。

私が作成しようとしている機能の例は次のとおりです: ユーザーが Click ハンドラーがナビゲーションをトリガーするボタン (つまり、NavigationContext.Navigate()) をクリックすると、ナビゲーションが実際に発生する前に、ボタンでアニメーションが発生します。不透明度を 1 から 0 に減らします (「フェードアウト」効果)。

したがって、順番に:

  1. ユーザーがボタンをクリックする
  2. ボタンはアニメーションを実行します
  3. ナビゲーションが発生します

簡単ですよね?次のようなアタッチされた動作を作成しました。

public class FadeBehavior : Behavior<Button>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Click += (obj, args) => {
            Storyboard sb = new Storyboard();

            DoubleAnimation an = new DoubleAnimation();
            an.Duration = TimeSpan.FromMilliseconds(300);
            an.From = 1;
            an.To = 0;
            Storyboard.SetTarget(an, AssociatedObject);
            Storyboard.SetTargetProperty(an, new PropertyPath("Opacity"));

            sb.Children.Add(an);
            sb.Begin();
        };
    }
}

ボタンがあるページの .xaml.cs にナビゲーションをトリガーする Click ハンドラーが含まれていない場合、これは明らかに正常に機能しますが、それを接続すると、ナビゲーションが発生する前にアニメーションが完了しません。もちろん、これがなぜなのかは理解していますが、これを達成する方法があり、ひどいデザインではないという素晴らしい特性も示しているのではないかと考えています.

一見関連しているこのSOスレッドを見つけましたが、受け入れられた答えは本当にこれを行う唯一の方法ですか?

ご協力いただきありがとうございます。

編集: たまたま WP7 を持っていて、これを理解しようと必死になっている場合、Reddit リーダー アプリ「Baconit」は、ストーリーのタイトルをクリックしたときに、私が興味を持っているものと同様の動作を示します。

4

1 に答える 1

0

アタッチされた動作を作成している場合、コードビハインドを排除することを目指していると思いますか? しかし、クリック ハンドラーをボタンに追加すると、コード ビハインドが発生しますか? ここで競合が発生するようです!

2つのオプションが表示されます...

コード ビハインドに満足している場合は、添付されたビヘイビアーのことは忘れてください。アニメーションを実行し、完了時にデリゲートを呼び出すユーティリティ クラスを作成するだけです。その後、この効果を適用したい場所ならどこでもこれを使用できます。

コード ビハインドを排除したい場合は、クリック ハンドラではなくコマンドを使用する必要があります。ストーリーボードの完了時に実行されるアタッチされた動作に ICommand プロパティを追加します。次に、ビューモデルを公開したコマンドにこれをバインドできます。

したがって、ブレンド動作プロパティでバインディングがどのように可能であるかを示す質問を参照してください。

Blend Behaviors - それらのプロパティにバインドできますか?

于 2012-02-11T10:24:50.240 に答える