如果你想使用嵌入式对话框没有额外的窗口,你可以使用棱镜的RegionManager来实现概述的行为。诀窍是平行的弹出区把你的主要区域在视觉树:
<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()以模态方式完成。但是,我会建议避免模态对话框。
更新:作为评论的要求,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"
的感谢!我实际上做了另一种方式,但非常类似于你的方式。我所做的是为我的shell区域使用内容控件,并在模块A中创建了一个项目控制区域。我将布局设置为在项目控制区域中使用网格,并且我在区域“popup”中执行了激活和停用视图。即时将给你的解决方案一试。将对结果进行反馈。再次感谢! – Zaheer 2010-03-21 11:12:11
嗨,奥利,你可以给出如何包含“IsNoPopUpActive”属性的片段吗? – ioWint 2011-08-18 20:25:04
嗨ioWint,我已经更新了答案。 – 2011-08-24 18:39:13