Для цього є два хороших способи: 1) діалогова послуга (легка, чиста) та 2) допомога перегляду. Перегляд допоміжних функцій надає деякі акуратні функції, але зазвичай цього не варто.
ДІАЛОГ-СЕРВІС
a) інтерфейс діалогового сервісу, наприклад через конструктор або якийсь контейнер залежності:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Ваша реалізація IDialogService повинна відкрити вікно (або ввести деякий елемент управління в активне вікно), створити подання, що відповідає імені даного типу dlgVm (використовувати реєстрацію контейнера або конвенцію або ContentPresenter з пов'язаними з типом DataTemplates). ShowDialogAsync повинен створити TaskCompletionSource та повернути його .Task proptery. Сам клас DialogViewModel потребує події, яку ви можете викликати у похідному класі, коли ви хочете закрити, а також переглядайте в діалоговому вікні фактично закриття / приховування діалогу та завершення TaskCompletionSource.
b) Для використання просто зателефонуйте в очікуйте this.DialogService.ShowDialog (myDlgVm) у вашому екземплярі якогось класу, похідного DialogViewModel. Після очікування повернення, перегляньте властивості, які ви додали у діалоговому вікні VM, щоб визначити, що сталося; вам навіть не потрібен зворотний дзвінок.
ПОГЛЯД ДОСЛІДЖЕННЯ
Це означає, що ви переглядаєте подію в моделі перегляду. Це все може бути перетворено на Blend Behavior, щоб уникнути коду та використання ресурсів, якщо ви настільки схильні (FMI, підклас класу "Поведінка", щоб побачити своєрідну властивість Blendable на стероїдах). Поки що ми зробимо це вручну на кожному перегляді:
a) Створіть OpenXXXXXDialogEvent зі спеціальним корисним навантаженням (похідний клас DialogViewModel).
б) Попросити представлення передплатити подію в його події OnDataContextChanged. Не забудьте приховати та скасувати підписку, якщо старе значення! = Null та у події Вивантажене вікно.
c) Коли подія запускається, перегляньте перегляд, який може знаходитися на ресурсі на вашій сторінці, або ви можете їх знайти за умовою в іншому місці (наприклад, у підході до діалогового сервісу).
Цей підхід є більш гнучким, але вимагає більше роботи. Я не дуже його використовую. Єдиною приємною перевагою є можливість, наприклад, розмістити погляд у вкладці. Я використав алгоритм, щоб розмістити його в межах поточного контролю користувачів або, якщо він недостатньо великий, обертати візуальне дерево, поки не знайдеться достатньо великий контейнер.
Це дозволяє діалоговим вікнам бути близьким до місця, яке вони фактично використовуються, лише затемнюють частину програми, пов’язану з поточною діяльністю, і дозволяють користувачеві переміщатися в межах додатка, не маючи вручну відштовхувати діалогові вікна, навіть мати кілька квазі- модальні діалоги відкриваються на різних вкладках або підпоглядах.