2010-03-19 4 views
9

мне нужна помощь с накладыванием вида с помощью призмы framework.Its немного больше, чем образующий комплекса, так пусть меня explain.I может быть чрезмерно думать, что это так: DWPF и Prism Просмотр Overlay

у меня есть оболочка (окно wpf), и у меня есть 2 вида (A & B - оба пользовательских элемента управления) в модуле. , когда оболочка загружает его, загружает вид A. В режиме просмотра A у меня есть кнопка «всплывающего» вида B для некоторого ввода пользователем. поэтому, естественно, я бы подумал о каком-то модальном окне/управлении, возможно, даже всплывающем окне. однако проблема, с которой я сталкиваюсь во всплывающем окне, заключается в том, что при перемещении оболочки всплывающее окно остается фиксированным, и оно не блокирует события в поле зрения A. Я попытался отключить просмотр A, чтобы остановить запуск событий, и я также попытался использовать получить представление B, перемещая его с помощью оболочки. Только холст работает, но теперь мне нужен способ блокировать его. Есть ли в любом случае, я могу наложить вид поверх другого представления с призмой? или как все остальные создают модальные всплывающие окна с призмой & wpf? любые рекомендации или указатели будут очень благодарны.

ответ

13

Если вы хотите использовать диалоговые окна без дополнительного окна, вы можете использовать RegionManager Prism для достижения описанного поведения. Хитрость заключается в том, чтобы поставить PopUp область параллельно главной области в визуальном дереве:

<Grid> 
    <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} /> 
    <ContentControl cal:RegionManager.RegionName="PopUpRegion"/> 
</Grid> 

Теперь используйте RegionManager поставить вид «А» в «MainRegion». Создайте класс контроллера, аналогичный IPopUpDialogController. Он должен нести ответственность за то, чтобы поместить ваше мнение «B» (или любой другой PopUpView в вашем приложении) в «PopUpRegion» по запросу. Кроме того, он должен контролировать флаг, который сигнализирует, что основной «MainRegion» будет включен или отключен. Таким образом, пользователь не сможет играть с элементами управления в вашем представлении «А», пока всплывающее окно не будет закрыто.

Это можно сделать модальным способом, используя ComponentDispatcher.PushModal(), прежде чем нажимать рамку на Диспетчер. Однако я бы рекомендовал избегать модальных диалогов.


Update: В соответствии с просьбой в комментариях, то IsNoPopUpActive может быть реализовано в модели представления подложки. Там вы можете связать его с видом коллекции RegionManager для всплывающей области:

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; } 
} 

Помните, чтобы вызвать событие PropertyChanged как только вы изменяете коллекцию просмотров (добавить/удалить всплывающее окно).

Только для информации: В настоящее время я избегаю отключения элементов управления в фоновом режиме и вместо этого вставляю прозрачную панель. Это позволяет избежать щелчка на элементах управления фона. Тем не менее, это не обрабатывает ввод с клавиатуры (вкладка в элементы управления). Чтобы исправить ввод с клавиатуры, вам нужно убедиться, что фокус клавиатуры в ловушке во всплывающем окне (MSDN on WPF Focus concepts).

Добавление следующего фокуса атрибуты всплывающей области должны сделать трюк:

KeyboardNavigation.DirectionalNavigation="None" 
KeyboardNavigation.ControlTabNavigation="None" 
KeyboardNavigation.TabNavigation="Cycle" 
KeyboardNavigation.TabIndex="-1" 
+0

спасибо очень много! Я действительно сделал это по-другому, но очень похож на ваш. что я сделал, использовал элемент управления содержимым для моей области оболочки и создал область управления элементами в модуле A. Я установил макет для использования сетки в области управления элементами, и все, что я сделал, активировал и деактивировал представления внутри области «всплывающее окно». я собираюсь дать вашему решению попробовать. будет обратная связь по результатам. еще раз спасибо! – Zaheer

+0

Привет, Олли, можете ли вы дать фрагмент о том, как включить свойство IsNoPopUpActive? – ioWint

+0

Привет, ioWint, я обновил ответ. –

2

Если вы используете WPF + MVVM с Prism вы посмотрите на это сообщение контроллера Просмотр наложения может. Приятная часть этого подхода - вы можете написать модульные тесты на вашей модели просмотра с помощью макетного контроллера наложения и вернуть макетному контроллеру результат, который пользователь выбрал бы на наложении.

Вы можете найти здесь: http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

Надеется, что это помогает

Смежные вопросы