8

这可能会让人觉得非常愚蠢,但我不知道是否:

  • 我是一个白痴
  • 我误解了一些东西
  • MS Web 浏览器控件被窃听

我更愿意认为是后者。

我在 WinForms 用户控件中有一个 Web 浏览器控件。它已在设计时添加到控件中,理论上,在控件的 Load 事件中,它应该导航到 Google。

看起来很简单。

然而。

public partial class TVHost : UserControl
{
    public TVHost()
    {
        InitializeComponent();
    }

    private void TVHost_Load(object sender, EventArgs e)
    {     
        webBrowser1.Navigate("http://google.co.uk");  
    }
}

这行不通。没有错误,什么都没有。插入断点/调试行表明 Load 事件甚至没有被调用。

此时我决定检查在 Designer.cs 文件中是否正确设置了 Load 事件。

 this.Load += new System.EventHandler(this.TVHost_Load);

似乎是合法的。

如果我从表单中删除 Web 浏览器控件,则会触发 load 事件。

我有点不明白,控件如何防止使用它的方法首先触发?

继续前进,我发现了这个: http ://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/d6e427b2-9cc9-4318-bb05-11363025e3f7/

TL; DR 的链接如下:“如果表单上有一个设置为 Visible = true 的网络浏览器,则加载将不起作用”

如果我将 webbrowser 的默认可见性更改为 false,那么肯定会触发控件的加载事件。我可以通过在加载事件中设置浏览器的可见性来解决这个问题。

private void TVHost_Load(object sender, EventArgs e)
{
    webBrowser1.Visible = true;
    webBrowser1.Navigate("http://google.co.uk");
}

很奇怪。

虽然这个“修复”有效,但我发现它非常hacky并且想知道是否有人对这种行为有任何解释?

令人惊讶的是,我在 2005 年遗留的 MS Connect 中发现了这个错误 - http://connect.microsoft.com/VisualStudio/feedback/details/116535/when-adding-a-webbrowser-control-to-a-user-control -加载不会触发#

4

1 回答 1

3

从您链接到的Connect 错误中的讨论:

现在,如果要触发 Load 事件,可以在属性网格中设置 WebBrowser 控件的 URL 属性。URL 可以是任何你想要的,甚至是 about:blank,如果你不希望它从加载的页面开始。

因此,如果您进入设计器并将WebBrowser'Url属性设置为字符串about:blank(告诉WebBrowser加载一个空页面),那么您的用户控件应该Load再次开始获取其事件。

于 2012-05-16T13:02:36.090 回答