ฉันจะเพิ่มพฤติกรรมที่กำหนดเองสำหรับรายการในแผงได้อย่างไร

ในโครงการ WPF ของฉัน ฉันต้องมีแผงที่มีพฤติกรรมดังต่อไปนี้ เมื่อคุณคลิกที่รายการ มันควรจะไปที่รายการด้านบนสุด

พฤติกรรมของรายการในแผง

ฉันมีคำถามหลายข้อเกี่ยวกับเรื่องนี้: 1. ฉันควรสร้างแผงแบบกำหนดเองและเพิ่มภาพเคลื่อนไหวในวิธี ArrangeOverride หรือไม่

ดังนั้น ฉันจำเป็นต้องเพิ่มตัวจัดการเหตุการณ์บางตัว แต่ไม่มีคลาสย่อยองค์ประกอบที่อยู่ในแผงนี้ และฉันต้องทำให้กระบวนการเคลื่อนไหวสูงขึ้นด้วย ฉันค่อนข้างติดอยู่กับวิธีแก้ปัญหานี้

ขอบคุณ.


person Leonid    schedule 26.02.2013    source แหล่งที่มา


คำตอบ (1)


ฉันไม่คิดว่าคุณจำเป็นต้องเขียนพาเนลหรือเพิ่มพฤติกรรมให้กับพาเนลของคุณ หากคุณจำลองคลาสของคุณถูกต้องในสิ่งที่คุณพยายามทำสามารถทำได้โดยใช้ ItemsControls พร้อมความสามารถในการเลือกรายการ (เช่น ListBox) - ฉันถือว่าคุณกำลังใช้ เอ็มวีวีเอ็ม

ประโยชน์ของแนวทางนี้คือ คุณไม่ได้สร้างและรักษาประเภทแผงเพิ่มเติมที่คุณอาจไม่ต้องการ นอกจากนี้ทุกสิ่งในโมเดลและโมเดลวิวของคุณสามารถทดสอบได้อย่างสมบูรณ์ ฉันขอแนะนำให้ใช้หรือขยายการควบคุมและคอนเทนเนอร์ 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 />

เมื่อผู้ใช้คลิกที่รายการใดรายการหนึ่งในกล่องรายการของคุณ คุณควรตั้งค่าคุณสมบัติ IsSelected ของรายการที่เกี่ยวข้องใน ItemVM เมื่อมีการเปลี่ยนแปลงคุณสมบัตินี้ คุณสามารถเพิ่มรายการนี้ลงในคอลเลกชันรายการขององค์ประกอบด้านบนในรายการของคุณได้

คุณสามารถควบคุมวิธีการสร้างเทมเพลต ItemModel ของคุณได้อย่างเต็มที่ ไอเท็มบนสุดจะมีไอเท็มในคอลเลกชั่น Items ซึ่งสามารถแสดงได้ในแบบที่คุณมีในไดอะแกรมของคุณ

เกี่ยวกับแอนิเมชั่น สามารถทำได้โดยใช้โค้ดหลังหรือคุณสมบัติที่แนบมา แนวคิดนี้ง่ายมาก คุณรู้ว่าผู้ใช้คลิกที่กล่องรายการที่ไหน และคุณควรจะได้ตำแหน่งขององค์ประกอบบนสุดใน กล่องรายการทำให้ DataTemplate เคลื่อนไหวจากตำแหน่งการคลิกปัจจุบันไปที่ด้านบนของรายการ

person Shrinand    schedule 26.02.2013
comment
วิธีการนี้ใช้ไม่ได้กับกรณีของฉัน ตัวอย่างเช่นคุณสามารถวางเฉพาะรายการที่ได้รับจาก ListViewItem ใน ListView อย่างที่ฉันรู้ มันจะทำงานอย่างไรหากฉันวาง Grid หรือส่วนควบคุมผู้ใช้บางส่วนลงในแผงนี้ ฉันรู้เกี่ยวกับ MVVM แต่ในกรณีนี้ ฉันต้องการแผงที่ปรับแต่งเอง ฉันกำลังพัฒนาแผงนี้ตอนนี้ ฉันวางซอร์สบน GitHub เมื่อเสร็จแล้ว - person Leonid; 27.02.2013
comment
ItemsControls ทั้งหมดมีคุณสมบัติ ItemsPanel ที่คุณสามารถตั้งค่าได้ ItemPanel นี้อาจเป็นแผง WPF ใดก็ได้ แต่ละรายการสามารถมี ItemTemplate พร้อมการควบคุมที่คุณเลือกได้ แต่ถ้าคุณต้องการสร้างแผงแบบกำหนดเองก็เป็นทางเลือกของคุณ - person Shrinand; 27.02.2013
comment
ฉันได้พัฒนาแผงประเภทนี้ขึ้นมา และถ้าฉันมีเวลาว่าง ฉันจะเผยแพร่แหล่งข้อมูลบน GitHub อย่างแน่นอน - person Leonid; 27.09.2013