如何在单独的类中创建Web浏览器控件?

时间:2015-08-25 17:26:16

标签: c# winforms webbrowser-control

我正在尝试创建一个类,当我创建它的实例时,它将在其中具有我可以与之交互的Web浏览器控件。当我在主窗体中创建浏览器控件时,我的代码工作,但当我尝试将它抽象到自己的类时,我不了解winforms如何工作。我猜我需要继承一些东西或者初始化它但我不确定。

这是类代码:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class MyBrowserFuncs
{
    public WebBrowser WB;
    public MyBrowserFuncs()
    {
        WB = new WebBrowser();

        WB.ObjectForScripting = this;

        WB.Navigate("mypage.html");
    }
    public string Test(string msg)
    {
        return WB.Document.InvokeScript
                            ("Test", new String[] { msg });
    }
}

以下是mypage.html上的相关javascript

function Test(msg)
{
    alert(msg);

    return "success";
}

以下是我想在C#中调用它的方式

private void btnSomething_Click(object sender, EventArgs e)
{
    var web = new MyBrowserFuncs();

    var text = web.Test("this is a message");
}

我没有收到任何错误,但它不起作用。它在主窗体中使用代码时有效。我猜它可能与InitializeComponent();有关,但我并不完全确定当我不需要它们并且想要将它们抽象为类时,我应该如何创建和处理控件。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

在MyBrowserFuncs类的测试方法中,接受WebBrowser实例以及字符串。这将使您可以访问它。例如:

public string Test(string msg, WebBrowser WB)
{
    return WB.Document.InvokeScript
                        ("Test", new String[] { msg });
}

只是想编辑,或许可以解释一下。您正在尝试在类中创建WebBrowser对象。我会在主Form1类中创建它,但是如果你将它(WebBrowser控件)作为WebBrowserFuncs方法的参数传递,那么这些方法将能够毫无问题地与Form1的控件进行交互。

答案 1 :(得分:0)

如果我将控件添加回调用表单,它就可以了,所以我这样做了:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class MyBrowserFuncs
{
    public WebBrowser WB;
    public MyBrowserFuncs(Form f)
    {
        WB = new WebBrowser();
        WB.Visible = false;
        f.Controls.Add(WB);
        WB.ObjectForScripting = this;

        WB.Navigate("mypage.html");
    }
    public string Test(string msg)
    {
        return WB.Document.InvokeScript
                            ("Test", new String[] { msg });
    }
}

然后我这样称呼它:

private async void btnSomething_Click(object sender, EventArgs e)
{
    var web = new MyBrowserFuncs(this);
    await Task.Delay(1000);
    var text = web.Test("this is a message");
}

我添加延迟只是为了看它是否有效而且确实如此。我会重构那个。