WPF и наложение Prism View

Мне нужна помощь с наложением видов с помощью фреймворка призмы. Он немного сложнее, поэтому позвольте мне объяснить. Я тоже могу над этим подумать: D

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


person Zaheer    schedule 19.03.2010    source источник


Ответы (2)


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

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

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

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


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

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

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

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

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

KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"
person olli-MSFT    schedule 19.03.2010
comment
Спасибо большое! На самом деле я сделал это по-другому, но очень похоже на ваш. я использовал элемент управления содержимым для своей области оболочки и создал область управления элементами в модуле A. Я установил макет для использования сетки в области управления элементами, и все, что я сделал, активировал и деактивировал представления во всплывающем окне области. Я собираюсь попробовать ваше решение. обратимся к результатам. еще раз спасибо! - person Zaheer; 21.03.2010
comment
Привет, Олли, не могли бы вы дать отрывок о том, как включить свойство IsNoPopUpActive? - person ioWint; 19.08.2011

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

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

Надеюсь это поможет

person droidalmatter    schedule 26.05.2011