Bagaimana cara menambahkan perilaku khusus untuk item di panel?

Dalam proyek WPF saya, saya perlu memiliki panel dengan perilaku berikut. Ketika Anda mengklik suatu item, item itu akan berada di item teratas atas.

Perilaku item di panel

Saya memiliki beberapa pertanyaan mengenai ini: 1. Haruskah saya membuat Panel khusus dan menambahkan animasi dalam metode ArrangeOverride?

Jadi, saya perlu menambahkan beberapa event handler, tetapi tanpa mensubklasifikasikan elemen yang ada di panel ini, dan saya juga perlu menganimasikan proses naik ke atas. Saya cukup terjebak dengan solusi untuk masalah ini.

Terima kasih.


person Leonid    schedule 26.02.2013    source sumber


Jawaban (1)


Saya tidak berpikir Anda perlu menulis panel atau menambahkan perilaku ke panel Anda, jika Anda memodelkan kelas Anda dengan benar, apa yang Anda coba lakukan dapat dicapai menggunakan ItemsControls dengan kemampuan untuk memilih item (yaitu ListBox) - Saya berasumsi Anda menggunakan MVVM.

Keuntungan dari pendekatan ini adalah Anda tidak membuat dan memelihara jenis panel tambahan yang mungkin tidak Anda perlukan. Ditambah lagi, semua yang ada di model dan model tampilan Anda dapat diuji unit sepenuhnya. Saya menyarankan untuk menggunakan atau memperluas kontrol dan container WPF yang ada bila memungkinkan, namun dalam kasus ini kita dapat melakukannya tanpanya.

Model Tampilan

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()
};
}
}

Model

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

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

Lihat

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

Setelah pengguna mengklik salah satu item di ListBox Anda, Anda harus mengatur properti IsSelected dari item terkait di ItemVM, pada perubahan properti ini, Anda dapat menambahkan item ini ke koleksi Item dari elemen teratas dalam daftar Anda.

Anda memiliki kendali penuh atas bagaimana Anda akan membuat Template ItemModel Anda, item teratas sekarang memiliki item dalam koleksi Items, yang dapat ditampilkan seperti yang Anda miliki di diagram Anda.

Mengenai Animasi Ini dapat dilakukan dengan menggunakan properti di belakang kode atau terlampir, idenya sederhana, Anda tahu di mana pengguna mengklik ListBox dan Anda seharusnya bisa mendapatkan posisi elemen teratas di ListBox, animasikan DataTemplate dari posisi klik saat ini ke bagian atas daftar

person Shrinand    schedule 26.02.2013
comment
Pendekatan ini tidak akan berhasil untuk kasus saya. Misalnya Anda hanya dapat menempatkan item yang berasal dari ListViewItem di ListView seperti yang saya tahu. Bagaimana cara kerjanya jika saya menempatkan Grid atau beberapa kontrol pengguna ke dalam panel ini? Saya tahu tentang MVVM tetapi dalam hal ini saya memerlukan beberapa panel yang disesuaikan. Saya sedang mengembangkan panel ini sekarang. Saya menempatkan sumber di GitHub setelah saya selesai. - person Leonid; 27.02.2013
comment
Semua ItemsControls memiliki properti ItemsPanel yang dapat Anda atur, ItemPanel ini dapat berupa Panel WPF apa pun. Setiap Item individual dapat memiliki ItemTemplate dengan kontrol pilihan Anda. Namun jika Anda ingin membuat Panel kustom itu pilihan Anda. - person Shrinand; 27.02.2013
comment
Saya telah mengembangkan panel semacam itu, dan jika saya memiliki waktu luang saya pasti akan mempublikasikan sumber di github. - person Leonid; 27.09.2013