Если вы хотите использовать встроенные диалоги без дополнительного окна, вы можете использовать Prism RegionManager для достижения описанного поведения. Хитрость заключается в том, чтобы поместить область всплывающих окон параллельно основной области в визуальном дереве:
<Grid>
<ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} />
<ContentControl cal:RegionManager.RegionName="PopUpRegion"/>
</Grid>
Теперь используйте RegionManager, чтобы поместить представление «A» в «MainRegion». Создайте класс контроллера, похожий на IPopUpDialogController. Он должен отвечать за размещение вашего представления «B» (или любого другого PopUpView в вашем приложении) в «PopUpRegion» по требованию. Кроме того, он должен управлять флагом, который сигнализирует о включении или отключении основного «MainRegion». Таким образом, пользователь не сможет играть с элементами управления в вашем представлении «А», пока всплывающее окно не закроется.
Это можно сделать даже в модальном режиме, используя 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"