ปัญหา EventToCommand กับ InputBindings

ฉันได้สร้างวิธีแก้ปัญหาเพื่อสร้างปัญหาที่ฉันมีกับ MVVM-Light EventToCommand กับ InputBindings ปัญหานี้เกิดขึ้นที่หน้าต่างหนึ่งโดยเปิดอีกหน้าต่างหนึ่ง และหากฉันเชื่อมต่อ InputBinding เข้ากับปุ่ม Escape และปิดมุมมองที่สอง หน้าต่างนั้นจะปิดมุมมองที่สองและกลับไปยังมุมมองแรก ถ้าฉันใช้ EventToCommand แทน แล้วเรียกคำสั่งเดียวกันด้วยตนเอง มันจะปิดมุมมองที่สอง มันจะปิดมุมมองแรกด้วย

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

ขั้นตอนมีดังนี้:

ทำงานได้ตามที่คาดหวัง

1) คลิกปุ่มหน้าต่างแรกเพื่อเปิดหน้าต่างที่สอง

2) กดปุ่ม Escape บนวินาทีเพื่อใช้การเชื่อมโยงอินพุต

กรณีปัญหา

1) คลิกปุ่มหน้าต่างแรกเพื่อเปิดหน้าต่างที่สอง

2) คลิกกล่องข้อความ "Hello" 3) กดปุ่ม Escape เพื่อใช้เส้นทาง EventToCommand และหน้าต่างทั้งสองปิดลง?

ตัวอย่างวิธีแก้ปัญหา


person Cheval    schedule 07.07.2011    source แหล่งที่มา


คำตอบ (2)


คุณต้องแจ้งกลไกการจัดการเหตุการณ์ WPF ว่าการกดปุ่มได้รับการจัดการในตัวจัดการเหตุการณ์ของคุณ และไม่ควรทำให้เกิดฟองในห่วงโซ่เหตุการณ์ หากคุณไม่ได้กล่องข้อความของคุณกำลังเรียกปิดบนหน้าต่างที่ใช้งานอยู่ (window2) และตัวจัดการ Escape กำลังเรียกปิดบนหน้าต่างที่ใช้งานอยู่ (window1 เนื่องจาก window2 ถูกปิดโดยตัวจัดการ Escape ของกล่องข้อความ) ดังนั้นหากคุณแก้ไขฟังก์ชัน Close2 ของคุณดังนี้ ทุกอย่างทำงานได้ดี:

    public void Close2(KeyEventArgs e)
    {
        if (e.Key == Key.Escape)
            Close();
        e.Handled = true;
    }
person AxelEckenberger    schedule 10.07.2011
comment
แน่นอน! เพียงเพราะเป็น WPF ไม่ได้หมายความว่า Windows Eventing จะเปลี่ยนแปลง ขอบคุณ. - person Cheval; 11.07.2011

ฉันคิดว่าปัญหาเกิดจากการที่คุณเชื่อมต่อเหตุการณ์ PreviewKeyDown ใน Listener EventToCommand ฉันคิดว่ามันกำลังตอบสนองต่อคีย์ที่ลงไปและปิดหน้าต่างก่อนที่เหตุการณ์ KeyUp และ KeyPress จะเริ่มทำงาน ซึ่งหมายความว่า KeyUp และ KeyPress กำลังจะเริ่มทำงานบนหน้าต่างหลัก ซึ่งตอบสนองโดยการปิด

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

person NathanAW    schedule 07.07.2011
comment
ในโค้ดจริงฉันเปลี่ยนเป็น PreviewKeyUp และดูเหมือนว่าจะใช้งานได้เช่นกัน ขอบคุณ. - person Cheval; 11.07.2011