从 Javascript 调用 C# 方法
html 文档和 WPF 之间的通信要求您在应用程序之间具有完全信任。在 javascript 中,window.external 指向外部应用程序,您可以使用它来调用 WebBrowser 之外的方法。
为此,您需要在两者之间创建一个接口。应该使用可以使用 Javascript 直接访问的辅助方法。让我们看看如何使用 WPF WebBrowser Control 来实现这一点。
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]
public class ObjectForScriptingHelper
{
Mainwindow mExternalWPF;
public ObjectForScriptingHelper(Window1 w)
{
this.mExternalWPF = w;
}
}
所以基本上该类允许您直接从 javascript 调用 .NET 方法。这个帮助类被设置为 FullTrust 和 ComVisible。所以我们的WebBrowser,实际上是一个Com元素,可以直接与类通信,调用ObjectForScriptingHelper类中的方法,该类是加载浏览器的父窗口。javascript 将允许使用 window.external 指向此类。
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]
public class ObjectForScriptingHelper
{
Mainwindow mExternalWPF;
public ObjectForScriptingHelper(Window1w)
{
this.mExternalWPF = w;
}
public void InvokeMeFromJavascript(string jsscript)
{
this.mExternalWPF.tbMessageFromBrowser.Text = string.Format("Message :{0}", jsscript);
}
}
假设我在 ObjectForScriptingHelper 类中有一个方法 InvokeMeFromJavascript。要使用此类,您需要创建它的一个对象并将其传递给 WebBrowser 控件的 ObjectForScripting 属性。
所以我写,
ObjectForScriptingHelper helper = new ObjectForScriptingHelper(this);
this.wbMain.ObjectForScripting = helper;
现在让我们导航到一个 html:
<input type="text" id="txtMessage" />
<input type="button" value="InvokeMe" onclick="javascript:window.external.InvokeMeFromJavascript(document.getElementById('txtMessage').value);" />
这将加载一个文本框和一个按钮。在上面的代码中,我使用 window.external 来调用我在 ObjectForScriptHelper 类中声明的相同函数。因此,当您单击 WebBrowser 内的 Button 时,您将看到消息显示在其外部的 TextBlock 中。
在上图中,当用户点击 WebBrowser 内部的 InvokeMe 时,它会更新放置在外部的 TextBlock。
资料来源:www.dotnetfunda.com/articles/article840-working-with-webbrowser-in-wpf.aspx