繁体   English   中英

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

[英]How to create web browser control in a separate class?

我正在尝试创建一个类,当我创建它的实例时,它将在其中具有一个可以与之交互的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%当我不需要可见的控件并将其抽象为类时应该如何创建和处理控件。

我究竟做错了什么?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM