มีสองวิธีที่ดีในการทำเช่นนี้ 1) บริการช่วยโต้ตอบ (ง่ายสะอาด) และ 2) มุมมองช่วย View assisted มีคุณสมบัติบางอย่างที่เรียบร้อย แต่โดยปกติแล้วจะไม่คุ้มค่า
บริการ DIALOG
ก) ส่วนต่อประสานบริการโต้ตอบเช่นผ่านตัวสร้างหรือคอนเทนเนอร์ที่พึ่งพา:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) การติดตั้ง IDialogService ของคุณควรเปิดหน้าต่าง (หรือฉีดตัวควบคุมบางส่วนเข้าไปในหน้าต่างที่ใช้งานอยู่) สร้างมุมมองที่สอดคล้องกับชื่อของประเภท dlgVm ที่กำหนด (ใช้การลงทะเบียนคอนเทนเนอร์หรือระเบียบหรือ ContentPresenter กับประเภท DataTemplates ที่เกี่ยวข้อง) ShowDialogAsync ควรสร้าง TaskCompletionSource และส่งกลับไปยัง .Task proptery คลาส DialogViewModel นั้นต้องการเหตุการณ์ที่คุณสามารถเรียกใช้ในคลาสที่ได้รับเมื่อคุณต้องการปิดและดูในมุมมองไดอะล็อกเพื่อปิด / ซ่อนไดอะล็อกจริง ๆ และทำ TaskCompletionSource ให้เสร็จสมบูรณ์
b) ในการใช้งานเพียงแค่โทร waitit this.DialogService.ShowDialog (myDlgVm) ในอินสแตนซ์ของคลาส DialogViewModel ที่ได้รับมา หลังจากรอผลตอบแทนให้ดูคุณสมบัติที่คุณได้เพิ่มไว้ในกล่องโต้ตอบ VM ของคุณเพื่อกำหนดสิ่งที่เกิดขึ้น คุณไม่จำเป็นต้องโทรกลับ
ดูการช่วยเหลือ
นี่คือมุมมองของคุณฟังเหตุการณ์ใน viewmodel ทั้งหมดนี้อาจถูกห่อหุ้มด้วยพฤติกรรมแบบผสมผสานเพื่อหลีกเลี่ยงโค้ดที่อยู่เบื้องหลังและการใช้ทรัพยากรหากคุณมีแนวโน้มมาก (FMI, คลาสย่อย "พฤติกรรม" เพื่อดูประเภทของคุณสมบัติที่แนบมาแบบผสมผสานบนเตียรอยด์) สำหรับตอนนี้เราจะทำสิ่งนี้ด้วยตนเองในแต่ละมุมมอง:
a) สร้าง OpenXXXXXDialogEvent ด้วย payload ที่กำหนดเอง (คลาสที่ได้รับ DialogViewModel)
b) ให้มุมมองสมัครสมาชิกเหตุการณ์ในเหตุการณ์ OnDataContextChanged อย่าลืมซ่อนและยกเลิกการเป็นสมาชิกหากค่าเก่า! = null และในเหตุการณ์ Unloaded ของ Window
c) เมื่อเหตุการณ์เริ่มขึ้นให้มุมมองเปิดมุมมองของคุณซึ่งอาจอยู่ในแหล่งข้อมูลบนหน้าเว็บของคุณหรือคุณสามารถค้นหาได้ด้วยการประชุมที่อื่น (เช่นในแนวทางบริการการโต้ตอบ)
วิธีนี้มีความยืดหยุ่นมากกว่า แต่ต้องใช้งานมากกว่านี้ ฉันไม่ได้ใช้มันมาก ข้อดีอย่างหนึ่งที่ดีคือความสามารถในการวางมุมมองทางกายภาพภายในแท็บตัวอย่างเช่น ฉันใช้อัลกอริทึมเพื่อวางไว้ในขอบเขตการควบคุมผู้ใช้ปัจจุบันหรือถ้าไม่ใหญ่พอให้สำรวจต้นไม้ที่มองเห็นจนกว่าจะพบคอนเทนเนอร์ที่มีขนาดใหญ่พอ
สิ่งนี้ช่วยให้กล่องโต้ตอบใกล้กับสถานที่ที่พวกเขาใช้งานจริงเพียงแค่สลัวส่วนหนึ่งของแอพที่เกี่ยวข้องกับกิจกรรมปัจจุบันและให้ผู้ใช้ย้ายไปรอบ ๆ ภายในแอพโดยไม่ต้องผลักกล่องโต้ตอบออกไปด้วยตนเอง กล่องโต้ตอบโมดอลจะเปิดในแท็บหรือมุมมองย่อยต่างๆ