【问题标题】:trigger an event to hosting WPF application from webbrowser control从 webbrowser 控件触发事件以托管 WPF 应用程序
【发布时间】:2017-10-14 18:45:40
【问题描述】:

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

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

【问题讨论】:

  • 能否修改 ASP.NET 应用程序?如果是,那么您可以将浏览器控件的 ObjectForScripting 属性设置为可以由站点从 JavaScript 通过 window.external 调用的类的实例。

标签: wpf webbrowser-control


【解决方案1】:

正如@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} !!!");
}

创建此类的一个实例并将其分配给 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 对象库 (MSHTML) Com 库中的 HtmlDocument 的一个实例,请确保在您的项目中引用它。

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

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

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

希望这有助于您了解WebBrowser 控件提供的操纵加载页面的能力。

【讨论】:

  • 这是一个很好的解释。尝试了同样的方法,就像一个魅力!谢谢!
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多