2

私の WPF プロジェクトでは、次のような動作をするパネルが必要です。アイテムをクリックすると、上部のアイテムに移動するはずです。

パネル内のアイテムの動作

これに関していくつか質問があります: 1. カスタム パネルを作成し、ArrangeOverride メソッドにアニメーションを追加する必要がありますか?

そのため、いくつかのイベント ハンドラーを追加する必要がありますが、このパネルにある要素をサブクラス化せずに、上に移動するプロセスをアニメーション化する必要もあります。私はこの問題の解決策に固執しました。

ありがとう。

4

1 に答える 1

0

パネルを作成したり、パネルに動作を追加したりする必要はないと思います。クラスを正しくモデル化すれば、アイテムを選択する機能を備えたItemsControls(つまりListBox)を使用して達成可能です-私はあなたが使用していると仮定していますMVVM。

このアプローチの利点は、おそらく必要のない追加のパネル タイプを作成および維持しないことです。さらに、モデルとビューモデルのすべてを完全に単体テストできます。可能な限り、既存の WPF コントロールとコンテナーを使用または拡張することをお勧めしますが、この場合、それがなくてもうまくいく可能性があります。

ビューモデル

public class ItemsVM
{

// You can always keep the items sorted based on you business rules
public ObservableCollection<ItemModel> Items {get;set;}

public ItemVM()
{
Items = new ObservableCollection<ItemModel>(){
new ItemModel(), new ItemModel()
};
}
}

モデル

public class ItemModel
{
public bool IsSelected {get;set;}
public ObservableCollection<ItemModel> Items {get;set;}

public ItemModel()
{
Items = new ObservableCollection<ItemModel>();
}
}

意見

<ListBox ItemsSource={Binding Items} SelectionMode=Single />

ユーザーが ListBox 内の項目の 1 つをクリックしたら、ItemVM 内の対応する項目の IsSelected プロパティを設定する必要があります。このプロパティの変更により、この項目をリストの最上位要素の Items コレクションに追加できます。

ItemModel をどのようにテンプレート化するかを完全に制御できます。最上位のアイテムには Items コレクションにアイテムが含まれるようになり、ダイアグラムにあるように表示できます。

アニメーションについて これは、コード ビハインドまたは添付プロパティを使用して行うことができます。アイデアは単純です。ユーザーが ListBox をクリックした場所を知っているので、ListBox の一番上の要素の位置を取得し、DataTemplate をアニメーション化する必要があります。リストの一番上への現在のクリック位置

于 2013-02-26T16:23:13.817 に答える