从 web 浏览器控件触发事件以托管 WPF 应用程序

trigger an event to hosting WPF application from webbrowser control

我有一个 WPF 用户控件,它使用网络浏览器控件托管 ASP.Net MVC 应用程序。

我想在 WebApplication 上执行特定操作时通知用户控件。 实现这一目标的可能方法是什么?

正如@Szabolcs Dézsi 在评论中提到的那样,如果您有权访问 Web 应用程序,则可以使用 WebBrowser.ObjectForScripting 对象实例并从 javascript 调用其方法。这是一个简单的演示:

[ComVisible(true)] // Class must be ComVisible
public class Demo
{
    public void SayHello(string name) => MessageBox.Show($"Hello {name} !!!");
}

创建此 class 的实例并将其分配给 WebBrowser 控件的 ObjectForScripting 属性:

webBrowser.ObjectForScripting = new Demo();

然后说我们在 WebBrowser 控件中显示的这个简单的 html 页面:

<html>
<head>
    <title></title>
    <script>
        function sayhello()
        {
            var name = document.getElementById('name').value;
            // the window.external is assigned an instance of 
            // class we created above.
            // We can call C# instance method SayHello directly.
            window.external.SayHello(name);
        }
    </script>
</head>
<body>
    <form action="#" method="post">
        <input id="name" type="text" name="name" value="" />
        <input type="submit" name="submit" value="Say Hello" onclick="sayhello()" />
    </form>
</body>
</html>

现在,只要您填写姓名并单击 SayHello 按钮,它就会按预期显示 MessageBox。

另外 你有 属性 WebBrowser.Document 它是 Microsoft HTML 对象库中 HtmlDocument 的一个实例( MSHTML) Com 库,确保在你的项目中引用它。

文档 属性 允许您查询当前页面的 DOM 对象,并且通过它您可以像 javascript 中那样通过公开的方法操作您的 html 页面HtmlDocument Class 喜欢 HtmlDocument.getElementById() 和许多其他人。

例如,此代码在 WebBrowser 控件加载页面后修改从上面 html 页面输入的名称的值属性:

webBrowser.LoadCompleted += new LoadCompletedEventHandler((o, e) =>
{
    if (webBrowser.Document is HTMLDocument DOM)
    {
        var namefield = DOM.getElementById("name");
        namefield.setAttribute("value", "Enter your name!!!");
    }
});

希望这可以帮助您了解 WebBrowser 控件为操纵加载的页面提供的强大功能。