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

本文关键字:创建 web 浏览器 控件 单独 | 更新日期: 2023-09-27 18:09:58

我试图使一个类,当我创建它的一个实例,然后它会有一个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();有关,但我不能100%确定我应该如何创建和处置控件,当我不需要它们可见,并希望将它们抽象到一个类。

我做错了什么?

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

在MyBrowserFuncs类的测试方法中,接受WebBrowser实例和字符串。这个可以让你进入它。例如:

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

只是想编辑和解释更多一点。您正在尝试在类中创建WebBrowser对象。我会把它放在主Form1类中,但是如果你把它(WebBrowser控件)作为一个参数传递给你的WebBrowserFuncs方法,这些方法将能够与Form1的控件进行交互,没有问题。

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

[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");
}

我添加延迟只是为了看看它是否有效。我将重构它