2009-08-27 106 views
1

我的Windows窗体应用程序(C#)有一个奇怪的问题。我在我的项目中有一个带有NotifyIcon的表单(Form1)和另一个表单(Form2)。 Form1有一些代码基本上做了一些XML解析,并在Form2上添加了一堆LinkLabel。这一切工作正常。Windows窗体:关闭,但不关闭

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

我有Form2上的一个按钮控件(称为 “关闭”),正在使用此事件处理代码:

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

关闭窗体2。这也很好。

但是,根据Form1的NotifyIcon上的“Refresh”ContextMenu MenuItem命中的次数,这是在Form2关闭之前必须按下Form2上的“关闭”按钮控件的次数。例如,如果用户三次在Form1上点击“Refresh”MenuItem,他们将不得不在Form2上点击“关闭”按钮控件三次。这几乎就像Form2明显关闭,但代码似乎没有认识到它已关闭。

我是新来的Windows窗体的发展,所以也许这是我不知道的生命周期的事情。任何帮助,将不胜感激。

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

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

在窗体2(消息),我有这个点击处理代码按钮:

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

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

您可以发布Refresh MenuItem的代码和用于打开Form2的代码吗? – 2009-08-27 21:39:23

+0

Is Fo RM2是一种无模式的形式?你有没有在btnClose_Click中放置一个断点来确保它每次都被调用? – 2009-08-27 21:39:48

回答

9

我觉得这条线是这个问题:

ico.DoubleClick += new MouseEventHandler(ico_ShowMsg); 

您不断添加更多的事件处理程序的双击,但从来没有删除它们(因为TrayIcon_Load被称为ico_Refresh

在您关闭对话框中,.ShowDialog()被再次调用,但多次添加了此事件处理程序。

+0

羞耻这没有upvoted更多。当我回去重读这个问题时(在代码编辑之后),我没有发现这个问题。好决定! – 2009-08-28 13:31:38

2

你的说明,看来你刷新菜单项启动一个表单2的新实例与以前的表单相比。

你能在Refresh menuitem后面显示代码吗?

+0

看到上面贴的代码 – 2009-08-27 23:22:20

2

我认为你正在创建窗体2的每一次新的实例,所以你必须关闭每一个...

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


UPDATE:好的,我明白了,那是因为你每次点击菜单项时,它增加了一个新的处理程序的事件(菜单项和NotifyIcon的):没有什么可以防止重复处理,因此处理程序多次呼吁。由于表单是以模态方式显示的,因此它会关闭,然后重新打开,然后关闭...

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

+0

看到上面贴的代码 – 2009-08-27 23:23:06

2

我不是100%肯定从你的问题,因为没有代码,但它就像你正在使用的东西的声音,我喜欢当窗体2推出以下:

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

如果是这种情况,并且表单总是显示在完全相同的位置,则不是您必须多次关闭“it”,而是其中有许多实际存在且可见的表单。尝试移动表格并查看它下面是否有任何内容。 :)

我建议改为有一个Form2类的实例保留在内存中,直到您的应用程序退出时才会关闭。根据需要显示和隐藏它。

+0

我想到了,但是当我抓住标题栏并移动它时,只有一种形式。 – 2009-08-27 23:21:31