Bri*_*tle 4 c# webbrowser-control winforms
我有一个包含Web浏览器控件的表单.此浏览器控件将从磁盘加载一些HTML并显示它.我希望能够在我的表单中的HTML访问C#代码中有一个按钮.
例如,HTML中的按钮可能会调用窗体上的Close()方法.
目标平台:C#和Windows Forms(任何版本)
Ash*_*Ash 18
我在过去的一些应用程序中已经实现了这一点,具体如下:(注意:下面的示例不是生产就绪的,应该仅用作指南).
首先创建一个普通的.NET类(public),其中包含您希望从Web浏览器控件中运行的Javasvcipt调用的公共方法.
最重要的是,它必须使用System.Runtime.InteropServices命名空间中的ComVisible(true)]属性进行修饰(IE中的Javascript基于COM).它可以被称为任何东西,我称之为"外部"以使事情更清晰.
using System.Runtime.InteropServices;
[ComVisible(true)]
public class External
{
private static MainWindow m_mainWindow = null;
public External(MainWindow mainWindow)
{
m_mainWindow = mainWindow;
}
public void CloseApplication()
{
m_mainWindow.Close();
}
public string CurrentDate(string format)
{
return DateTime.Now.ToString(format);
}
}
Run Code Online (Sandbox Code Playgroud)
接下来在包含Web浏览器控件的.NET表单中创建COMVisible类的实例,然后将Web浏览器控件ObjectForScripting设置为该实例:
private void MainWindow_Load(object sender, EventArgs e)
{
m_external = new External(this);
browserControl.ObjectForScripting = m_external;
}
Run Code Online (Sandbox Code Playgroud)
最后,在Web浏览器控件中运行的Javascript中,您可以通过window.external对象访问.NET方法.在这种情况下,window.external实际引用(间接通过COM interop包装器)上面创建的"External"对象:
// Javascript code
function CloseButton_Click()
{
if (window.external)
{
window.external.CloseApplication();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,从Javascript到.NET的调用将通过COM互操作层,因此必须进行查询默认接口,编组参数等.换句话说,它可能相对较慢,如果您打算例如从循环内进行多次调用,那么请进行一些性能测试.
此外,仅供将来参考,从.NET调用Javascript代码更简单,只需使用Document.InvokeScript方法:
browserControl.Document.InvokeScript("jScriptFunction", new object[] { "param1", 2, "param2" });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16656 次 |
| 最近记录: |