【问题标题】:Save window state when application in tray应用程序在托盘中时保存窗口状态
【发布时间】:2013-04-30 13:40:24
【问题描述】:

我有一个应用程序可以通过单击“关闭”按钮最小化到系统托盘,我想保存它的状态(位置、所有元素(组合框、文本框)及其值等)。

现在我编写了这段代码,但它从托盘创建了一个新窗口(而不是使用它的参数恢复旧窗口):

# 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();
      })

});

如何针对我的问题修改此代码?

【问题讨论】:

  • 不要关闭并重新创建窗口,只是隐藏它。
  • 好的,我做到了,但是我如何才能从App.xaml.cs 访问 MainWindow 实例以恢复窗口?

标签: c# wpf system-tray windowstate


【解决方案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();
  };

如果您确定 MainWidnow 是您的应用程序主窗口,那么您也可以使用它:

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

我更喜欢第一个变体,因为它很明确。

【讨论】:

  • 好的,听起来不错,但我如何在第一次运行窗口时将MainWindow 实例保存到m_MainWindow var?
  • 在某些时候你会创建一个窗口的实例,不是吗?如果您没有明确创建它,您可以使用自动设置的 Application.MainWindow 属性,请参阅msdn.microsoft.com/en-us/library/…
  • 是的,它有效(我使用了this.MainWindow 变量)!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多