簡體   English   中英

WPF和棱鏡視圖疊加

[英]WPF and Prism View Overlay

我需要一些幫助,使用棱鏡框架覆蓋視圖。它比這更復雜,所以讓我解釋一下。我也可能過度思考這個:D

我有shell(wpf窗口),我有一個模塊中的2個視圖(A和B - 兩個用戶控件)。 當shell加載時,它加載視圖A.在視圖A上,我有一個“彈出”視圖B的按鈕,用於某些用戶輸入。 所以我自然會想到某種模態窗口/控件,甚至可能是一個彈出窗口。 然而我面對彈出窗口的問題是,當我移動shell時,彈出窗口仍然是固定的,它不會阻止視圖A中的事件。我已經嘗試禁用視圖A來停止被觸發的事件,我也嘗試使用一個來獲取視圖B隨shell移動。 只有畫布可以工作,但我現在需要一種方法來阻止它'。 無論如何,我可以用棱鏡將視圖覆蓋在另一個視圖的頂部嗎? 或者其他人如何用prism和wpf創建模態彈出窗口? 任何建議或指示將不勝感激。

如果要在沒有額外窗口的情況下使用嵌入式對話框,可以使用Prism的RegionManager來實現概述的行為。 訣竅是將PopUp區域與可視樹中的主區域平行:

<Grid>
   <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} />
   <ContentControl cal:RegionManager.RegionName="PopUpRegion"/>
</Grid>

現在使用RegionManager將視圖“A”放入“MainRegion”。 創建一個類似於IPopUpDialogController的控制器類。 它應該負責根據需要將您的視圖“B”(或您的應用程序中的任何其他PopUpView)放入“PopUpRegion”。 另外,它應該控制一個標志,指示啟用或禁用基礎“MainRegion”。 這樣,在彈出窗口關閉之前,用戶將無法使用視圖“A”中的控件進行播放。

在將幀推送到Dispatcher之前,通過使用ComponentDispatcher.PushModal(),甚至可以以模態方式完成此操作。 但是,我建議避免使用模態對話框。


更新 :根據評論中的要求,可以在支持視圖模型中實現IsNoPopUpActive。 在那里你可以將它鏈接到RegionManager的彈出區域的View集合:

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; }
}

請記住,一旦修改了視圖集合(添加/刪除彈出窗口),就會觸發PropertyChanged事件。

僅供參考 :現在我避免在后台禁用控件而是插入透明面板。 這可以避免單擊背景控件。 但是,這不處理鍵盤輸入(標簽到控件)。 要修復鍵盤輸入,您需要確保鍵盤焦點被捕獲在彈出窗口中( MSF on WPF Focus概念 )。

將以下焦點屬性添加到彈出區域應該可以解決問題:

KeyboardNavigation.DirectionalNavigation="None"
KeyboardNavigation.ControlTabNavigation="None"
KeyboardNavigation.TabNavigation="Cycle"
KeyboardNavigation.TabIndex="-1"

如果您使用帶Prism的WPF + MVVM,您可以查看此消息視圖覆蓋控制器。 關於這種方法的好處是你可以使用模擬覆蓋控制器在視圖模型上編寫單元測試,並讓模擬控制器返回用戶在疊加層中選擇的結果。

你可以在這里找到它: http//presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM