2011-07-05 56 views
7

我有一個彈出窗口,當雙擊列表視圖中的項目時彈出。
它以主窗口爲中心,看起來非常漂亮。
問題是當用戶移動主窗口或選擇另一個程序時,彈出窗口浮在其他東西之上。WPF彈出窗口替代

我想要一個類似彈出窗口的東西,這意味着它漂浮在窗口中的其他元素之上,但在主窗口移動時保持居中,並且不漂浮在其他頂部程式。
我可以做出這樣的彈出式動作,還是有更好的方法來做到這一點?

+0

這是在VB.Net 2010年,並不認爲Popup具有.Owner作爲屬性,如果我嘗試設置'Window.GetWindow(Me).Owner = Application.Current.MainWindow'我得到一個錯誤,說'無法將所有者屬性設置爲自己。因此,我不確定如何正確執行此操作。 – AndyD273

+1

由於這是「wpf彈出窗口超越其他應用程序」的Google熱門遊戲。如果你想使用其他原因的彈出窗口,我只想刪除鏈接到http://stackoverflow.com/questions/16316139/popup-doesnt-lose-focus-and-close-until-ive-clicked-a -control-in-it – Morten

+0

真棒,感謝您的提示 – AndyD273

回答

3

在這種情況下,您可能比彈出式窗口更適合您的需求Adorner。裝飾者也可以漂浮在窗戶上方。有一些差異,主要是裝飾者必須與UIElement(包括窗口)綁定。

+0

你知道在事實之後是否可以將元素應用於元素嗎?我試圖讓這個程序非常模塊化,所以彈出彈出窗口的列表視圖是自定義用戶控件的一部分,該控件嵌入頁面中,該頁面位於窗口中的導航框架內。我想這樣做是爲了讓我所要做的就是將Adorner代碼放在用戶控件中,並告訴它附加到窗口。我可以將它附加到用戶控件上,但我希望將它集中在窗口中。 – AndyD273

+0

是的,他們可以像彈出窗口一樣快速添加和刪除。例如,我編寫了自己的DataGrid,並使用Adorner作爲單元格的編輯窗口。確保你的窗口有一個AdornerLayer(我建議在你的Xaml中添加一個),並且你可以很容易地將裝飾者置於其中。 –

+0

解釋過程的任何好資源?顯然「AdornerLayer」非常含糊,沒有很多好的例子來說明它的最佳使用方式。大多數例子都是「在文本框的一角放一個點」,並且爲每一個類寫一個類。完成後,我可能會有十幾個「彈出」式控件,大部分都包含一個自定義的用戶控件,如果能夠幫助它,我寧願不必爲每個控件都編寫一個特定的類。彈出窗口非常易於使用,能夠在XAML中進行設計並根據需要進行顯示。這種簡單創作的裝飾者控制將會非常棒。 – AndyD273

0

我還沒有找到一種方法,使彈出窗口停止這樣做在WPF

作爲替代方案,您可以創建就像一個彈出一個用戶控件。

通常,我在Canvas控件中將應用程序的內容部分與Popup一起託管,並且當IsPopupOpen變爲True時,我將彈出窗口Visibility = Visible。

+0

這可能是要走的路,但我仍然不確定最好的方式來做到這一點。 ListView位於頁面內的CustomUserControl中,位於導航框內,位於窗口內部(不是主窗口,以防更容易) – AndyD273

+0

我可以向頁面添加一個Canvas, m不知道如何冒泡命令從UserControl中打開它 – AndyD273

+0

@ AndyD273我會將彈出窗口添加到頂層控件(在本例中爲Window),並在ViewModel中有一個屬性「IsPopupOpen」。然後,我會設置一個Event偵聽器來偵聽ShowPopupEvent,並在引發該事件時顯示彈出窗口。您也可以將彈出內容作爲ShowPopupEvent參數的一部分傳入。 – Rachel

3

窗口大小調整或移動時,彈出窗口不會移動。因爲Popups/Context菜單不是Visual Tree的一部分。你必須爲此使用Adorner。我會建議閱讀this四部分系列,以便在Adorner上快速入門。

+0

您是否知道在事實之後是否可以將元素應用於元素?我試圖讓這個程序非常模塊化,所以彈出彈出窗口的列表視圖是自定義用戶控件的一部分,該控件嵌入頁面中,該頁面位於窗口中的導航框架內。我想這樣做是爲了讓我所要做的就是將Adorner代碼放在用戶控件中,並告訴它附加到窗口。我可以將它附加到用戶控件上,但我希望將它集中在窗口中。 – AndyD273