WPF и наложение представления призмы

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

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

11
задан Zaheer 19 March 2010 в 13:09
поделиться

1 ответ

Если вы хотите использовать встроенные диалоги без дополнительного окна, вы можете использовать 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() перед передачей кадра в диспетчер. Однако я бы рекомендовал избегать модальных диалогов.


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

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

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

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

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

KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"
15
ответ дан 3 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: