2013-04-30 30 views
2

我有一個應用程序,通過點擊「關閉」按鈕,使系統托盤最小化,我想保存它的狀態(位置,所有元素(組合框,文本框)與他們的值等) 。保存窗口狀態,當應用程序在托盤

現在,我寫了這個代碼,但它創建了一個新的窗口,從托盤(而不是恢復舊的,其參數):

# app.xaml.cs: 

this.ShutdownMode = ShutdownMode.OnExplicitShutdown; 

// create a system tray icon 
var ni = new System.Windows.Forms.NotifyIcon(); 
ni.Visible = true; 
ni.Icon = QuickTranslator.Properties.Resources.MainIcon; 

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    var wnd = new MainWindow(); 
    wnd.Visibility = Visibility.Visible; 
    }; 

// set the context menu 
ni.ContextMenu = new System.Windows.Forms.ContextMenu(new[] 
{ 
    new System.Windows.Forms.MenuItem("About", delegate 
    { 
     var uri = new Uri("AboutWindow.xaml", UriKind.Relative); 
     var wnd = Application.LoadComponent(uri) as Window; 
     wnd.Visibility = Visibility.Visible; 
    }), 

    new System.Windows.Forms.MenuItem("Exit", delegate 
     { 
     ni.Visible = false; 
     this.Shutdown(); 
     }) 

}); 

我怎麼能修改此代碼爲我的問題嗎?

+1

不要關閉並重新創建窗口,只需隱藏它。 – 2013-04-30 13:51:12

+0

好吧,我做了,但我怎麼能從'App.xaml.cs'獲得MainWindow實例的恢復窗口? – 2013-04-30 13:54:35

回答

1

當你持有對'MainWindow'的引用時,你可以在關閉它之後再次簡單地調用Show()。關閉窗口將簡單地隱藏它,再次調用Show將恢復它。

private Window m_MainWindow; 

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    if(m_MainWindow == null) 
     m_MainWindow = new MainWindow(); 

    m_MainWindow.Show(); 
    }; 

如果you're確保MainWidnow是你的應用的主要窗口,那麼你也可以使用這個:

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    Application.MainWindow.Show(); 
    }; 

我寧願因爲it's明確的第一個變種。

+0

好吧,聽起來不錯,但我怎麼可以在第一次運行窗口時將'MainWindow'實例保存爲'm_MainWindow' var? – 2013-04-30 13:58:43

+0

在某些時候,你會創建一個窗口實例嗎?如果你不明確創建它,你可以使用自動設置的Application.MainWindow屬性,參見http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx – Mecaveli 2013-04-30 14:02:41

+0

是的,它工作(我使用了一個'this.MainWindow'變量)!非常感謝你! – 2013-04-30 14:07:47

相關問題