如何从另一个类(ApplicationContext)显示已经实例化(运行)类Form1

时间:2015-02-05 22:18:26

标签: c# .net winforms system-tray notification-area

我有一个Application Context类,在其中我有一些方法将Form1类发送到system-tray,我的问题是如何在系统托盘中运行时显示已经实例化的类From1,例如:

class MyApplicationContext : ApplicationContext
{
    private NotifyIcon TrayIcon;
    private ContextMenuStrip TrayIconContextMenu;
    private ToolStripMenuItem CloseMenuItem;

    private void TrayIcon_DoubleClick(object sender, EventArgs e)
    {  
        // How to show Form1 hire.
    }
    //... 
}



 public partial class Form1 : Form
    {
            public Form1()
            {
                InitializeComponent();
            }
           //...
    }

如果我实例化一个新类,它将为我提供新表单,并且所有正在运行的进程都将消失为例:

private void TrayIcon_DoubleClick(object sender, EventArgs e)
 {  
      Form1 frm = new Form1();
      frm.Show(); //How to show my form?
 }

不确定原型模式是否可以在这里工作,是否有更简单的解决方案?

这是我的班级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Windows.Forms;
using System.Windows;

namespace DJBackupDB
{
    class MyApplicationContext : ApplicationContext
    {
        //Component declarations
        private NotifyIcon TrayIcon;
        private ContextMenuStrip TrayIconContextMenu;
        private ToolStripMenuItem CloseMenuItem;
        public static Form1 form;

        public MyApplicationContext()
        {
            Application.ApplicationExit += new EventHandler(this.OnApplicationExit);
            InitializeComponent();
            TrayIcon.Visible = true;
        }

        private void InitializeComponent()
        {
            TrayIcon = new NotifyIcon();

            TrayIcon.BalloonTipIcon = ToolTipIcon.Info;
            TrayIcon.BalloonTipText =
              "I noticed that you double-clicked me! What can I do for you?";
            TrayIcon.BalloonTipTitle = "You called Master?";
            TrayIcon.Text = "My fabulous tray icon demo application";


            //The icon is added to the project resources.
            //Here I assume that the name of the file is 'TrayIcon.ico'
            TrayIcon.Icon = Properties.Resources.logo;

            //Optional - handle doubleclicks on the icon:
            TrayIcon.DoubleClick += TrayIcon_DoubleClick;

            //Optional - Add a context menu to the TrayIcon:
            TrayIconContextMenu = new ContextMenuStrip();
            CloseMenuItem = new ToolStripMenuItem();
            TrayIconContextMenu.SuspendLayout();

            // 
            // TrayIconContextMenu
            // 
            this.TrayIconContextMenu.Items.AddRange(new ToolStripItem[] {
            this.CloseMenuItem});
            this.TrayIconContextMenu.Name = "TrayIconContextMenu";
            this.TrayIconContextMenu.Size = new Size(153, 70);
            // 
            // CloseMenuItem
            // 
            this.CloseMenuItem.Name = "CloseMenuItem";
            this.CloseMenuItem.Size = new Size(152, 22);
            this.CloseMenuItem.Text = "Close the tray icon program";
            this.CloseMenuItem.Click += new EventHandler(this.CloseMenuItem_Click);

            TrayIconContextMenu.ResumeLayout(false);
            TrayIcon.ContextMenuStrip = TrayIconContextMenu;
        }

        private void OnApplicationExit(object sender, EventArgs e)
        {
            //Cleanup so that the icon will be removed when the application is closed
            TrayIcon.Visible = false;
        }

        private void TrayIcon_DoubleClick(object sender, EventArgs e)
        {
            form.Show();
        }

        private void CloseMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Do you really want to close me?",
                    "Are you sure?", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                Application.Exit();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您必须将表单对象存储在可以在事件中访问它的位置。为表单创建一个类成员字段就像你对NotifyIcon和其他东西一样。

private Form1 form;

然后在创建ApplicationContext时,将表单字段设置为Form1对象。

然后在click事件处理程序中,您只需调用:

this.form.Show();