【问题标题】:Windows Form: closing, but not closingWindows 窗体:关闭,但不关闭
【发布时间】:2009-08-27 21:35:24
【问题描述】:

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

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

我在 Form2 上有一个按钮控件(称为“关闭”),它正在使用这个 EventHandler 代码:

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

关闭 Form2。这也很好用。

但是,根据 Form1 的 NotifyIcon 上的“刷新”ContextMenu MenuItem 被点击的次数,这是在 Form2 关闭之前必须按下 Form2 上的“关闭”按钮控件的次数。例如,如果用户点击 Form1 上的“刷新”菜单项 3 次,他们将不得不点击 Form2 上的“关闭”按钮控件 3 次。这几乎就像 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();
    }
}

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

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

    //I have also tried:
    if (this.Visible)
        this.Hide();
}

【问题讨论】:

  • 你能把刷新菜单项的代码和你用来打开Form2的代码贴出来吗?
  • Form2 是无模式表单吗?您是否在 btnClose_Click 中放置了一个断点以确保每次都调用它?

标签: c# winforms


【解决方案1】:

我认为这行是问题所在:

ico.DoubleClick += new MouseEventHandler(ico_ShowMsg);

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

关闭对话框后,.ShowDialog() 会再次被调用,但该事件处理程序已添加了多次。

【讨论】:

  • 很遗憾这没有得到更多的支持。当我回去重新阅读问题时(在代码编辑之后),我没有发现。好电话!
【解决方案2】:

根据您的解释,您的 Refresh MenuItem 似乎在以前的表单上启动了 Form 2 的新实例。

您能展示一下 Refresh menuitem 背后的代码吗?

【讨论】:

    【解决方案3】:

    我不能 100% 确定您的问题,因为没有代码,但在我看来,当 Form2 启动时您正在使用类似以下内容:

    Form2 f = new Form2();
    f.Show();
    

    如果是这种情况,并且表单总是显示在完全相同的位置,并不是说您必须多次关闭“它”,而是实际上有那么多的“它”在那里并且可见。试着四处移动表格,看看它下面是否有任何东西。 :)

    我建议将 Form2 类的一个实例保留在内存中,并且在您的应用退出之前不会关闭。根据需要显示和隐藏它。

    【讨论】:

    • 我是这么想的,但是当我抓住标题栏并移动它时,只有一个表格。
    【解决方案4】:

    我认为您每次都在创建 Form2 的新实例,因此您必须关闭每个实例...

    您能否发布 NotifyIcon MouseDoubleClick 事件处理程序的代码?


    更新:好的,我明白了,这是因为每次单击菜单项时,它都会向事件(menuitem 和 notifyicon)添加一个新的处理程序:没有什么可以防止重复的处理程序,所以处理程序被多次调用。由于表单是模态显示的,它关闭,然后重新打开,然后关闭......

    您只需要注册一次处理程序(例如在构造函数中)。此外,您可以在 ico_Refresh 中调用 DoXmlParsing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      相关资源
      最近更新 更多