【问题标题】:I have a system task tray application - Can I close the main form instead of just hiding it?我有一个系统任务托盘应用程序 - 我可以关闭主窗体而不是隐藏它吗?
【发布时间】:2013-01-05 17:27:01
【问题描述】:

我有一个应用程序,它有一个主窗体和一个系统任务托盘图标。在主窗体的设计器中,我把TrayIcon控件拖到窗体上,所以它是主窗体的子窗体。

此时,当用户按下主窗体上的关闭按钮时,它实际上只是将它隐藏起来,以便应用程序不会终止,除非用户右键单击 TrayIcon 并单击退出。但是,主窗体有很多控件和资源,当主窗体被隐藏时,它仍然会为这些资源占用内存。我的目标是实际处理表单,以便它在不使用时不会占用该内存。

除非我弄错了,当主窗体被隐藏时,它不再占用该内存,但我认为情况并非如此。 我不是内存方面的专家,我什至可能完全搞错内存管理的工作原理,因此这个问题是无效的。

无论如何,如果我是正确的,当主窗体仅被隐藏时,它仍会占用可以通过完全关闭窗体来释放的内存,有没有办法让我在不终止应用程序的情况下真正关闭主窗体?如果是这样,我需要在Program 类中而不是在主窗体的类中使用代码创建TrayIcon,对吗?

【问题讨论】:

标签: c# winforms memory-management system-tray


【解决方案1】:

不,这当然没有必要。 鼓励设计者的便利,但您可以轻松创建仅按需创建窗口的应用程序。您将不得不编写代码。它不需要一个 heckofalot,有一个具有基本功能的示例应用程序。编辑 Program.cs 文件,使其看起来与此类似(需要图标,我称之为“SampleIcon”):

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var cms = new ContextMenuStrip();
        cms.Items.Add("Show", null, ShowForm);
        cms.Items.Add("Exit", null, ExitProgram);
        var ni = new NotifyIcon();
        ni.Icon = Properties.Resources.SampleIcon;
        ni.ContextMenuStrip = cms;
        ni.Visible = true;
        Application.Run();
        ni.Dispose();
    }

    private static void ShowForm(object sender, EventArgs e) {
        // Ensure the window acts like a singleton
        if (MainWindow == null) {
            MainWindow = new Form1();
            MainWindow.FormClosed += delegate { MainWindow = null; };
            MainWindow.Show();
        }
        else {
            MainWindow.WindowState = FormWindowState.Normal;
            MainWindow.BringToFront();
        }
    }

    private static void ExitProgram(object sender, EventArgs e) {
        Application.ExitThread();
    }

    private static Form MainWindow;
}                                                                

【讨论】:

  • 我不得不将if (MainWindow == null) 更改为if (MainWindow == null || MainWindow.IsDisposed),显然当表单关闭时,引用它的变量实际上并没有设置为null。但这很好用!谢谢!
猜你喜欢
  • 2018-08-24
  • 2011-09-27
  • 2016-09-03
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多