5

アプリに ObservableCollections にバインドされた Listboxes がいくつかあります。項目が削除されている場合は、その項目をアニメーション化したいと考えています。

FrameworkElement.Loaded イベントを使用して追加された項目をアニメーション化することについての質問は既に見つけましたが、もちろん Unloaded イベントでは同じようには機能しません。

データテンプレートで使用できる方法でこれを行う方法はありますか?

編集: ItemsSource の CollectionChanged イベントに接続し、アニメーションを手動で適用しようとしました。現在、次のようになっています。

  ListBoxItem item = stack.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
        item.LayoutTransform = new ScaleTransform(1, 1);

    DoubleAnimation scaleAnimation = new DoubleAnimation(); 
    scaleAnimation.From = 1; 
    scaleAnimation.To = 0; 
    scaleAnimation.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 500));
    ScaleTransform transform = (ScaleTransform)item.LayoutTransform;
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, scaleAnimation);

問題は、まったく機能しないことです。アイテムはまだ飛び出します。メソッドが呼び出されたとき、アイテムはまだそこにあるので、アイテムが消える前にアニメーションを再生するべきではありませんか? それとも私はそれを完全に間違っていますか?

4

4 に答える 4

1

Present.Commands Fluent API を使用して、コマンドの実行中に表示状態を変更できます。リストボックスでアイテムを追加および削除するアニメーションの例をここに投稿しました http://adammills.wordpress.com/2011/01/11/mvvm-animation-of-listbox-present-commands/

于 2011-01-13T04:54:59.023 に答える
1

それらを削除する前にイベントを発生させていたとしても、とにかくすぐに削除されることが判明しました。だから私はそれを監視可能なスタックとして使用していたので、削除された要素をコレクションに残して後で削除することでこれを回避しました。このような:

public class ObservableStack<T> : ObservableCollection<T> 
{
    private T collapsed;
    public event EventHandler BeforePop;

    public T Peek() {
        if (collapsed != null) {
            Remove(collapsed);
            collapsed = default(T);
        }
        return this.FirstOrDefault();
    }

    public T Pop() {
        if (collapsed != null) { Remove(collapsed); }
        T result = (collapsed = this.FirstOrDefault());
        if (BeforePop != null && result != null) BeforePop(this, new EventArgs());
        return result;
    }

    public void Push(T item) {
        if (collapsed != null) {
            Remove(collapsed);
            collapsed = default(T);
        }
        Insert(0, item);
    }
}

最善の解決策ではないかもしれませんが、うまくいきます (少なくともスタックとしてのみ使用する場合)。

于 2009-05-01T11:47:34.967 に答える
1

現時点ではコード ウィンドウにアクセスできないため、これは少し先の話ですが、FrameworkElement を Unloading イベントで拡張し、ObservableCollection の CollectionChanged からそれを開始していただけますか。カスタム ObservableColleciton とカスタム FrameworkElement クラスを使用することを意味しますが、必要なものを提供できますか?

于 2009-04-30T13:06:37.063 に答える