如何在单独的类中创建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%确定我应该如何创建和处置控件,当我不需要它们可见,并希望将它们抽象到一个类。
我做错了什么?
在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");
}
我添加延迟只是为了看看它是否有效。我将重构它