触发事件以从webbrowser控件托管WPF应用程序

时间:2017-10-14 18:45:41

标签: wpf webbrowser-control

我有一个WPF用户控件,它使用webbrowser控件托管ASP.Net MVC应用程序。

我想在WebApplication上执行某个操作时通知usercontrol。 有哪些可能的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

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

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

创建此类的实例并将其分配给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的属性,其中HtmlDocument的实例位于Microsoft HTML对象库(MSHTML)库中,请确保在项目中引用它

Document属性允许您查询当前页面的DOM对象,通过它可以像javascript一样通过HtmlDocumentHtmlDocument.getElementById()等类公开的方法操作您的html页面。

例如,此代码在WebBrowser控件加载页面之后修改从html页面上方输入的name的value属性:

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

希望这有助于您了解WebBrowser控件提供的操作加载页面的强大功能。