"Прекрасный" способ сделать модальный диалог в WPF с помощью Prism и MVVM Pattern
вчера я использовал google, чтобы найти несколько способов сделать удивительный многоразовый модальный диалог в WPF с PRISM 4.1 и шаблоном MVVM. Я нашел несколько примеров, но я должен сказать, что они не были такими "хорошенькими", как мне им нравилось.
Этот: WPF Modal Dialog (нет mvvm → не используется)
Это довольно приятно: Показывать диалоговые окна при использовании шаблона MVVM (но все же он использует самодельный ServiceLocator, который мне не нужен, поскольку я использую контейнер IUnity Container Я мог бы использовать логику и переписать ее в Unity, но это не "прекрасный" способ в моем честном мнении.
После некоторого поиска в Интернете для информации какой-то блог (не могу найти источник прямо сейчас) сказал мне, что в PRISM Framework есть что-то, называемое "запросы взаимодействия". Поэтому я проверил документацию на призму и нашел небольшую часть в разделе "расширенные сценарии mvvm", но информации, приведенной в документации, недостаточно.
Я хотел бы знать, есть ли у кого-нибудь хороший пример или хороший блог-блог о том, как реализовать удивительный модальный диалог в призме wpf с mvvm.
ИЗМЕНИТЬ:
Что касается вопроса в комментариях:
Что делает модальный диалог потрясающим?
Действительно хороший вопрос.
- Он должен быть модальным (в то время как диалог открыт, остальная часть пользовательского интерфейса
должен быть заморожен)
- В диалоговом окне может быть собственная модель просмотра или
по крайней мере, я хотел бы предоставить экземпляр объекта для диалога
просмотреть и вернуть объект обратно в родительский вид
- Представление должно быть собственным файлом "xaml"
- функция dialogresult от .NET или
наименее способ получить ответ, который пользователь нажал в диалоговом окне
Ответы
Ответ 1
Запросы на взаимодействие требуют немного дополнительной работы, но они, безусловно, являются правильным способом перейти от перспективы пуриста MVVM...
Я видел пример того, как это сделать с Prism в Карле Шиффлетте MVVM In The Box расширение обучения.
Как я помню, пример был довольно грубым по краям, но он должен установить вас в правильном направлении.
Проблема с этим видом диалогового окна "Диалог" заключается в том, что он не позволяет диалогу выйти за пределы родительского окна. С положительной стороны вы можете сделать много причудливых макетов и анимационных материалов.
Ответ 2
В PRISM 5.0 появилось быстрое решение для показа модальных диалогов. Использование PopupWindowAction.
<prism:InteractionRequestTrigger SourceObject="{Binding CustomPopupViewRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:CustomPopupView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
Ответ 3
проверить мое сообщение из здесь
его простой, его mvvm, его служба и "все, что вам нужно делать" в вашей модели просмотра:
var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);
Ответ 4
Предостережение: я не использовал PRISM, и мой ответ предполагает использование только WPF и MVVM. Я не рассматриваю это как серьезную проблему, так как ваш список требований может быть выполнен без PRISM (который может быть добавлен поверх базового решения на более позднем этапе).
У меня есть проект Github, который предоставляет настраиваемый элемент FrameworkElement под названием ModalContentPresenter
, который позволяет отображать модальный контент. Элемент в основном состоит из двух панелей, один из которых расположен поверх другого. На задней панели размещается основной контент, а на передней панели размещается ваш модальный контент. Элемент имеет свойство зависимостей, которое определяет, отображается ли модальное содержимое.
Элемент предоставляет только базовую "модальную" функциональность и способен размещать произвольный контент (как и большинство элементов управления WPF). Если, например, модальный контент, который вы показываете, должен выглядеть и вести себя как окно (иметь заголовок, кнопку закрытия, перетаскивание мышью и т.д.), Тогда вам все равно придется выполнять некоторую работу.
Вот как ModalContentPresenter
может удовлетворить ваши требования:
Он должен быть модальным (пока диалог открыт, остальная часть пользовательского интерфейса должна быть заморожена)
ModalContentPresenter
может быть размещен на любом уровне вашей визуальной иерархии, и все, что находится за модальным контентом (если отображается), будет недоступным. Элементы управления по-прежнему будут включены и будут реагировать на любые изменения в модуле viewModel, к которому они привязаны, но пользователь не сможет перемещаться и взаимодействовать с элементами управления с помощью мыши и клавиатуры.
В диалоговом представлении может быть собственная модель viewmodel или, по крайней мере, я хотел бы предоставить экземпляр объекта для диалогового окна и вернуть объект обратно в родительский вид.
fooobar.com/info/353775/... показывает, как я рекомендую вам достичь этого.
Представление должно быть собственным файлом "xaml"
Как первичный, так и модальный контент можно определить с помощью встроенных xaml или отдельных файлов xaml (например, UserControl
).
функция dialogresult из .NET или, по крайней мере, способ получить ответ, который пользователь нажал в диалоговом окне
Связанный ответ показывает, как получить "ответ" из вашего модального контента. Основная предпосылка заключается в том, что ваши viewModels общаются нормально (либо напрямую, либо с помощью других средств, таких как шина событий). Единственное отличие состоит в том, что вы просто являетесь отображением вашего контента таким образом, чтобы пользователь мог взаимодействовать только с "модальными" данными.