我在WPF4上使用的是MVVM模式,尽管我对这两种模式都不熟悉。我正在寻找一个好的解决方案来使用一个可以接收Javascript命令并与ViewModel通信的WebBrowser控件。它需要满足以下条件:
正在工作的网站不在我的控制之下,不能编辑或更新。它大量使用ActiveX并且不接受非IE浏览器(Awesomium将不能工作),所以标准的WPF WebBrowser控件可能是唯一的选择。
This question提供了一种将浏览器控件的源代码与附加属性绑定的解决方案。虽然我不确定如何将值返回到Viewmodel,但我认为这可以调整为使用导航方法来发送javascript。这是我需要克服的主要障碍。
Heavy编辑-问题收到非常低的意见,没有答案,完全改写
发布于 2011-08-28 23:01:20
如果您正在与站点开发人员合作为您的应用程序创建解决方案,那么您将使用ObjectForScripting
在JavaScript和应用程序之间进行通信。有一篇很好的文章here,还有另一个可能对here有帮助的问题。
然而,我理解您的问题,该站点是一个任意的第三方站点,与您的应用程序无关,您希望自动填充某些表单值并在代码中提交表单。
为此,您可以处理WebBrowser的LoadCompleted
事件。当加载的文档readyState
更改为completed时,将调用此方法。因此,您可以使用此事件作为挂钩,然后设置/读取文档表单值。注意:您需要在项目中添加对Microsoft mshtml
的引用。
下面是一个MVVM风格的命令,它允许事件使用行为直接绑定到ViewModel
。这等效于在代码隐藏中注册事件处理程序。
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
类,它在事件触发时提供发送者和事件参数,但访问发送者取决于您自己的实现。
发布于 2011-09-03 01:19:52
我不知道为什么我以前从来没有想到过这一点,但解决方案似乎如此简单。
使用<ContentControl>
并将其内容绑定到ViewModel中的WebBrowser属性,而不是在视图上使用<WebBrowser
>控件。在ViewModel的构造函数中创建WebBrowser,然后可以将浏览器的导航事件(或文档加载)注册到ViewModel中的事件。
从ViewModel完全控制浏览器!您甚至可以捕获用户事件,因为它们为导航页面所做的任何操作都将在ViewModel的导航事件中捕获。
https://stackoverflow.com/questions/7179177
复制相似问题