【问题标题】:C# UserControl, Add Event Handler ManuallyC# UserControl,手动添加事件处理程序
【发布时间】:2017-07-28 08:15:17
【问题描述】:

我正在尝试手动向我的 Web 浏览器控件添加新的鼠标单击事件处理程序,因为 Web 浏览器的设计器属性中没有鼠标单击事件。

每当用户在 Web 浏览器控件内单击时,我都需要运行代码。此解决方法通过其现有的 DocumentCompleted 事件处理程序添加 Web 浏览器没有的处理程序。

当我运行下面的代码时,它返回一个空异常。我想知道是否可以这样做。

编辑:我添加了 while 循环以确保 webbrowser1 完成加载。但是,现在它卡在了 while 循环中。是不是意味着网页永远加载不完?

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    try
    {
        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
        }
        webBrowser1.Document.Body.MouseDown += new HtmlElementEventHandler(Body_MouseDown);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.StackTrace);
        Debug.WriteLine(ex.Message);
    }
}

private void Body_MouseDown(Object sender, HtmlElementEventArgs e)
{
    if( e.MouseButtonsPressed == MouseButtons.Left)
    { 
        MessageBox.Show("File in web browser selected");
    }
}

【问题讨论】:

  • 如果您托管的页面中的DocumentBody 未完全加载,则可能会发生这种情况。在添加处理程序之前,您是否尝试过将 webBrowser1 ReadyState 的条件检查添加为 WebBrowserReadyState.Complete
  • 添加后我意识到webBrowser1 不在WebBrowserReadyState.Complete 中,并且我需要的事件处理程序没有添加。如何确保它位于WebBrowserReadyState.Complete
  • while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } 我试过了,但是代码卡在了while循环中。
  • 不是while 循环,而是if 条件。浏览器的每次状态更改都会触发文档完成处理程序。

标签: c# winforms event-handling


【解决方案1】:

你的代码必须是这样的:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        webBrowser1.Document.Body.MouseDown += new HtmlElementEventHandler(Body_MouseDown);
    }
}

【讨论】:

  • 感谢 Praty,我尝试了他的,但该事件从未添加,因为网络浏览器从未处于就绪状态。
  • 这不常见!我的建议是调试并查看DocumentBody 处于哪个状态不为空,并相应地更改条件。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多