2013-04-30 109 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

相关问题