我正在尝试创建一个类,当我创建它的实例时,它将在其中具有我可以与之交互的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();
有关,但我并不完全确定当我不需要它们并且想要将它们抽象为类时,我应该如何创建和处理控件。
我做错了什么?
答案 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");
}
我添加延迟只是为了看它是否有效而且确实如此。我会重构那个。