如果你想使用嵌入式對話框沒有額外的窗口,你可以使用棱鏡的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