2010-03-19 112 views
9

我需要一些帮助,使用棱镜framework.Its一点比这更复合,所以让我explain.I可能是过度思考这个问题,以及覆盖的观点:dWPF和棱镜视图叠加

我有shell (wpf窗口),我有2个视图(A & B - 两个用户控件)在模块中。 当外壳加载它加载视图A.在视图A我有一个按钮来“弹出”视图B 为一些用户输入。所以自然我会想到某种形式的窗口/控制,甚至可能是一个弹出窗口。然而,我弹出的问题是,当我移动壳弹出保持不变,它不会阻止视图A中的事件。我试过禁用视图A停止事件被解雇,我也试图使用一个让视图B随shell一起移动。只有画布的作品,但我现在需要一种方法来阻止它''。无论如何,我可以用棱镜覆盖另一个视图顶部的视图吗?或者其他人如何用棱镜创建模态弹出窗口& wpf?任何意见或指针将不胜感激。

回答

13

如果你想使用嵌入式对话框没有额外的窗口,你可以使用棱镜的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" 
+0

的感谢!我实际上做了另一种方式,但非常类似于你的方式。我所做的是为我的shell区域使用内容控件,并在模块A中创建了一个项目控制区域。我将布局设置为在项目控制区域中使用网格,并且我在区域“popup”中执行了激活和停用视图。即时将给你的解决方案一试。将对结果进行反馈。再次感谢! – Zaheer 2010-03-21 11:12:11

+0

嗨,奥利,你可以给出如何包含“IsNoPopUpActive”属性的片段吗? – ioWint 2011-08-18 20:25:04

+0

嗨ioWint,我已经更新了答案。 – 2011-08-24 18:39:13