首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在WPF WebBrowser控件中使用Javascript

如何在WPF WebBrowser控件中使用Javascript
EN

Stack Overflow用户
提问于 2011-08-25 00:46:01
回答 2查看 13.7K关注 0票数 20

我在WPF4上使用的是MVVM模式,尽管我对这两种模式都不熟悉。我正在寻找一个好的解决方案来使用一个可以接收Javascript命令并与ViewModel通信的WebBrowser控件。它需要满足以下条件:

  1. 能够从Javascript表单中收集值并将其返回到ViewModel
  2. 运行Javascript命令(设置表单值、使用表单值执行逻辑步骤、提交表单)之前使用Javascript确定ReadyState某些跨多个页面发生的加载

正在工作的网站不在我的控制之下,不能编辑或更新。它大量使用ActiveX并且不接受非IE浏览器(Awesomium将不能工作),所以标准的WPF WebBrowser控件可能是唯一的选择。

This question提供了一种将浏览器控件的源代码与附加属性绑定的解决方案。虽然我不确定如何将值返回到Viewmodel,但我认为这可以调整为使用导航方法来发送javascript。这是我需要克服的主要障碍。

Heavy编辑-问题收到非常低的意见,没有答案,完全改写

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-28 23:01:20

如果您正在与站点开发人员合作为您的应用程序创建解决方案,那么您将使用ObjectForScripting在JavaScript和应用程序之间进行通信。有一篇很好的文章here,还有另一个可能对here有帮助的问题。

然而,我理解您的问题,该站点是一个任意的第三方站点,与您的应用程序无关,您希望自动填充某些表单值并在代码中提交表单。

为此,您可以处理WebBrowser的LoadCompleted事件。当加载的文档readyState更改为completed时,将调用此方法。因此,您可以使用此事件作为挂钩,然后设置/读取文档表单值。注意:您需要在项目中添加对Microsoft mshtml的引用。

下面是一个MVVM风格的命令,它允许事件使用行为直接绑定到ViewModel。这等效于在代码隐藏中注册事件处理程序。

代码语言:javascript
复制
public ICommand LoadCompleted
{
    get
    {
        return new EventToCommandWithSender<NavigationEventArgs>(
            (s,e) => { 

               WebBrowser browser = (WebBrowser) sender;
               // false if nested frame
               if (e.IsNavigationInitiator)
               {
                   mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)browser.Document;
                   // always completed
                   var readyState = doc.readyState;
                   // populate form
                   var name = doc.body.document.getElementById("username");
                   name.value = "@TheCodeKing";
                   // submit form
                   var submit = doc.body.document.getElementById("submit");
                   submit.Click();
                }
        });
    }
}

不幸的是,NavigationEventArgs不提供访问HTML文档或请求数据的方法。它确实包含WebRequest属性,但尚未实现,并且将始终为null。在我的示例中,我假设了一个自定义的EventToCommandWithSender类,它在事件触发时提供发送者和事件参数,但访问发送者取决于您自己的实现。

票数 11
EN

Stack Overflow用户

发布于 2011-09-03 01:19:52

我不知道为什么我以前从来没有想到过这一点,但解决方案似乎如此简单。

使用<ContentControl>并将其内容绑定到ViewModel中的WebBrowser属性,而不是在视图上使用<WebBrowser>控件。在ViewModel的构造函数中创建WebBrowser,然后可以将浏览器的导航事件(或文档加载)注册到ViewModel中的事件。

从ViewModel完全控制浏览器!您甚至可以捕获用户事件,因为它们为导航页面所做的任何操作都将在ViewModel的导航事件中捕获。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7179177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档