2010-11-30 140 views
9

我有一個WPF窗口作爲一種「通知窗口」在後臺線程上運行...當一個事件被引發時,它顯示一條消息...用戶點擊「貪睡」按鈕,我打電話this.Visibility = Visibility.Collapsed如何在不關閉的情況下「隱藏()」模式WPF窗口?

當我隱藏窗口的時候(通過調用this.Hide()或設置Visibility,如上所述)...「ShowDialog()」代碼釋放窗口並關閉它。

這絕對是一個WPF代碼中的錯誤(我通過反射器識別出來)......但是我的問題依然存在。有沒有人能夠想出解決這個問題的方法?

我試過很多東西,我現在深入到你們大家聰明的人:)

回答

0

確定,並以最快速度是 - 我的老闆(老C++愚蠢的傢伙,他是)想出答案。

這裏我的後臺線程裏面的代碼(這是設置爲STA模式):

// Show dialog - keeps the thread open and shows the window! Yay!!! 
new BeamUI.Notifier.NotifierWindow().ShowDialog(); 

這裏是修改,那奇怪的作品完美:)

// Show... hmm, that shows the window... but how do I keep this thread open? 
new BeamUI.Notifier.NotifierWindow().Show(); 

// ZOMG - a line of code that JUST keeps the thread (and msgpump) going!!! 
System.Windows.Threading.Dispatcher.Run(); 

就是這樣。

雖然這種事情讓我討厭C++人,但我只想說「如果你只是把它建立在第一位,我就不必尋找解決方法!」 (j/k)

+0

至於爲什麼這個作品的解釋... ShowDialog的錯誤,我在這個問題沒有處置窗口提到,但剛剛發佈了thread-message-pump-hold-it-open-dealio。所以,現在我們已經不再依賴於「dealio」了......隱藏/顯示/隱藏/顯示都很好:) – 2010-11-30 18:00:10

+0

您不需要頂層窗口(顯示)的單獨線程。除非你有沒有告訴我們這些情況,否則主UI線程將自行處理這個問題。 – Tergiver 2010-11-30 18:27:31

+0

還有更多 - 通知需要自己的上下文,因爲即使主UI有一個消息框(另一個「ShowDialog」窗口),該通知程序窗口也需要能夠響應點擊等。 – 2010-11-30 18:34:35

6

您無法隱藏模式對話框。這就像問:「我怎樣才能達到每小時100英里的速度?」你沒有,你開車向前。

使用Show而不是ShowDialog。或者你可以簡單地重新ShowDialog,當它需要變得可見了。

2

蒂莫西的答案很好。我只需要爲我之情況添加以下

window.Closed += new EventHandler(window_Closed); 
window.Show(); 
System.Windows.Threading.Dispatcher.Run(); 

,然後在事件...

void window_Closed(object sender, EventArgs e) 
{ 
    System.Windows.Threading.Dispatcher.ExitAllFrames(); 
} 

我需要做的,是因爲它被掛在運行的形式是真的關閉後。

2
  1. 爲了顯示模式窗口始終使用ShowDialog()

  2. 使用Close()而不是Hide()

  3. 處理的FormClosing事件這樣的:

 
    private void OnFormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = true; 
     this.Visible = false; 
    } 
相關問題