单击MessageBox中的帮助按钮可多次加载帮助链接

时间:2016-02-17 13:53:25

标签: c# .net winforms .net-4.0

当我显示MessageBox helpFilePath设置为某个网址时,网址会多次加载。在我看来,网址加载的次数等于我父母的表格加一次。

任何人都可以解释为什么会这样吗?

根据MSDNHelpRequested事件将在活动表单上触发:

  

当用户单击“帮助”按钮时,将指定帮助文件   helpFilePath参数已打开。拥有消息框的表单   (或活动表格)也会收到HelpRequested事件。

     

helpFilePath参数的格式可以是 C:\ path \ sample.chm   或 /folder/file.htm

但我不明白为什么在父表单上提升HelpRequested事件应加载来自子表单MessageBox的链接。

我做了一些我不应该做的事情吗?

此代码将重现该行为:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // First button spawns new instances of the form
        var button1 = new Button { Text = "New Form" };
        Controls.Add(button1);
        button1.Click += delegate
        {
            using (var form = new Form1())
                form.ShowDialog();
        };

        // Second button shows the MessageBox with the help-button
        var button2 = new Button { Text = "Dialog", Left = button1.Right };
        Controls.Add(button2);
        button2.Click += delegate
        {
            MessageBox.Show(
                "Press Help", 
                "Caption", 
                MessageBoxButtons.OK, 
                MessageBoxIcon.None, 
                MessageBoxDefaultButton.Button1, 
                0, // Default MessageBoxOption (probably not related to the behaviour) 
                "http://SomeHelpSite.com/MyOnlineHelp.htm");
        };
    }
}

点击"新表格"几次:

enter image description here

然后点击"对话框":

enter image description here

现在,点击帮助按钮:

enter image description here

在我的计算机上打开SomeHelpSite.com树时间:

enter image description here

1 个答案:

答案 0 :(得分:2)

我找到了一种方法来阻止未经考虑的行为,并可能解释为什么会发生这种情况。

要阻止在第一个之后打开未经过隔离的URL,您只需为HelpRequested事件添加一个处理程序。在这种情况下,您应通知WinForms引擎您已处理了帮助请求,无需采取进一步措施

public Form1()
{
    InitializeComponent();
    this.HelpRequested += onHelpRequested;
    .....
}
protected void onHelpRequested(object sender, HelpEventArgs e)
{
    e.Handled = true;
}

这样,只打开一个页面。

现在可能会在MSDN页面上为 helpEventArgs Handled property报告解释原因的原因,您可以在此处找到此声明:

  

如果未将此属性设置为true,则会将事件传递给   Windows进行额外处理。

编辑进一步的测试显示,在没有将Handled属性设置为true的情况下,HelpRequested事件的事件处理程序存在的简单事实会阻止未经考虑的行为