2010-03-19 130 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