Windows窗体:关闭,但不关闭

Kri*_*s B 1 c# winforms

我的Windows窗体应用程序(C#)有一个奇怪的问题.我的项目中有一个带有NotifyIcon的表单(Form1)和另一个表单(Form2).Form1有一些代码基本上做了一些XML解析,并在Form2上添加了一堆LinkLabel.这一切都很好.

在NotifyIcon上,我有一个带有EventHandler的ContextMenu MenuItem(称为"Refresh"),基本上可以通过XML解析命令运行.我还在NotifyIcon上有一个MouseDoubleClick命令,当双击系统托盘图标时,它会打开Form2(使用ShowDialog())来显示LinkLabels的链接.这也很好.

我在Form2上有一个Button Control(称为"Close"),它正在使用这个EventHandler代码:

private void btnClose_Click(object sender, EventArgs e)
{
    this.Close();
}
Run Code Online (Sandbox Code Playgroud)

关闭Form2.这也很好.

但是,根据Form1的NotifyIcon上的"刷新"ContextMenu MenuItem被击中的次数,这是在Form2关闭之前必须按下Form2上的"关闭"按钮控件的次数.例如,如果用户三次击中Form1上的"刷新"MenuItem,则必须在Form2上按三次"关闭"按钮控件.这几乎就像Form2明显关闭一样,但代码似乎并没有意识到它是关闭的.

我是Windows Form开发的新手,所以也许这是我不了解的生命周期.任何帮助,将不胜感激.

编辑.我会尝试发布相应的代码:

//NotifyIcon Form (Form1)
//ico is the ID of the NotifyIcon
public partial class TrayIcon : Form
{
    Message msg = new Message(); //Form2
    ContextMenu contextMenu = new ContextMenu();

    public TrayIcon()
    {
        InitializeComponent();
    }

    private void TrayIcon_Load(object sender, EventArgs e)
    {
        contextMenu.MenuItems.Clear();
        contextMenu.MenuItems.Add(0, new MenuItem("Refresh", new System.EventHandler(ico_Refresh)));

        ico.DoubleClick += new MouseEventHandler(ico_ShowMsg);

        DoXmlParsing();
    }

    private void ico_Refresh(object Sender, EventArgs e)
    {
        TrayIcon_Load(null, null);
    }

    private void ico_ShowMsg(object Sender, MouseEventHandler e)
    {
        if (msg.Visible == false)
            msg.ShowDialog();
    }
}
Run Code Online (Sandbox Code Playgroud)

在Form2(消息)上,我有一个带有此Click处理程序代码的Button:

private void btnClose_Click(object sender, EventArgs e)
{
    this.Close();

    //I have also tried:
    if (this.Visible)
        this.Hide();
}
Run Code Online (Sandbox Code Playgroud)

rec*_*ive 9

我认为这一行是问题所在:

ico.DoubleClick += new MouseEventHandler(ico_ShowMsg);
Run Code Online (Sandbox Code Playgroud)

您继续为双击添加更多事件处理程序,但从不删除它们(因为TrayIcon_Load调用了ico_Refresh.

关闭对话框后,.ShowDialog()会再次调用该事件,但很多时候都会添加此事件处理程序.