ไม่สามารถลาก ListBoxItem Adorner นอก ListBox ใน WPF -ScrollViewerProblem

ฉันกำลังทำงานกับแอปพลิเคชัน WPF ที่ใช้การลากและวางจำนวนมาก ทุกอย่างทำงานได้ดี ยกเว้น ListBoxItems ฉันมีกล่องรายการพร้อม ListBoxItems ที่สามารถลากไปยังเป้าหมายอื่นได้ (StackPanel) ปัญหาคือ เมื่อฉันลากเคอร์เซอร์ไปนอก ListBox ฉันไม่เห็น Adorner ที่ฉันตั้งค่าไว้ด้วย ListBoxItem?

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

ด้านล่างนี้ฉันได้แนบรูปลักษณ์ของ UI ไปแล้ว อย่างที่คุณเห็นมีกล่องรายการอยู่ที่ด้านซ้ายล่าง เมื่อฉันลากรายการ adorner จะปรากฏขึ้น และตามเคอร์เซอร์ไปรอบๆ ขณะที่เคอร์เซอร์อยู่เหนือกล่องรายการ แต่ถ้าฉันพยายามย้ายเคอร์เซอร์ออกจากกล่องรายการ ดูเหมือนว่า Adorner เกือบจะไปอยู่ภายใต้การควบคุมอื่นๆ (zIndex?) . ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข - วิธีแก้ไข ฉันได้เปลี่ยนรหัสเพื่อจัดการ AdornerLayer ที่สัมพันธ์กับหน้าต่างซึ่งตรงข้ามกับ AdornedElement

ฉันจึงเปลี่ยน

    layer = AdornerLayer.GetAdornerLayer(_originalElement);

to

    layer = AdornerLayer.GetAdornerLayer(this);

วิธีนี้ช่วยแก้ปัญหาของ ScrollViwer ที่ตัด AdornerLayer


person TheJediCowboy    schedule 16.02.2011    source แหล่งที่มา


คำตอบ (1)


กล่องรายการ (หรือเฉพาะเจาะจงคือ ScrollViewer ภายในกล่องรายการ) จะคลิป adorners ใด ๆ ที่แนบมากับลูก ๆ ของมัน การทำเช่นนี้เพื่อให้แน่ใจว่าจะไม่แสดงเครื่องประดับสำหรับรายการที่เลื่อนออกไปนอกมุมมอง เพื่อหลีกเลี่ยงปัญหานี้ คุณจะต้องใส่สิ่งต่าง ๆ ไว้ใน adorner ของ Window อย่างชัดเจน ไม่ใช่ใส่ไว้ในกล่องรายการหรือกล่องรายการ

person Robert Levy    schedule 17.02.2011
comment
เรื่องนี้สมเหตุสมผล คุณรู้ไหมว่าฉันสามารถหาตัวอย่างวิธีการดำเนินการนี้ได้ที่ไหน หรือมีข้อเสนอแนะใดๆ อีกทางเลือกหนึ่งที่ฉันคิดคือนำการคลิป scrollviewer ออกโดยใช้ StackPanel สำหรับรายการของฉันแทน ListBox - person TheJediCowboy; 17.02.2011
comment
ฉันสามารถแก้ไขปัญหานี้ได้ ฉันได้แสดงรหัสที่ฉันแทนที่ด้านบนแล้ว ขอบคุณที่ชี้ให้ฉันไปในทิศทางที่ถูกต้อง! - person TheJediCowboy; 17.02.2011
comment
การเรียก AdornerLayer.GetAdornerLayer(mainWindow) จะได้รับค่า null คืน คุณสามารถอ้างถึง ลิงก์ - person YantingChen; 03.06.2019