【问题标题】:WPF WebBrowser - call methods in JavaScriptWPF WebBrowser - 在 JavaScript 中调用方法
【发布时间】:2014-04-13 19:13:34
【问题描述】:

我正在开发一个 WPF 应用程序,它只有一个 WebBrowser,它使用 JavasCript 启动一个 HTML 页面。我也有一些 C# 方法。

我正在寻找一种在 JavaScript 中启动我的 C# 方法的好方法,带有参数和可能的回调。

现在,我有一些 JavaScript 方法可以导航到“myApp://mymethod?param1=value&param2=value”之类的特殊 URL,并且在 webBrowser 的“导航”事件中,我检查了 URL 并调用了我需要带参数。

此解决方案有效,但 URL 的大小受到限制。如何发送更重的数据? (自定义标头数据、POST、cookie、本地存储或其他我不知道的东西...... :))

我不能使用 window.external,因为最后我会使用 Xamarin 来做一个跨平台的应用程序。 WebBrowser 将适用于 Windows,但 IOS 使用不支持 window.external (stevesaxon.me/posts/2011/...) 的 UIWebView,因此我需要一个适用于任何地方的解决方案,并且自定义 URL 有大小限制。

如果有人有解决方案...

【问题讨论】:

  • 我没用过,但你可以在 WebBrowser 对象上查找 ObjectForScripting 属性。
  • 谢谢,但我忘了说它最后应该是多平台的(我将使用 Xamarin 用于 IOS 和 android)。我将在 Windows 上拥有一个“WebBrowser”,在 android 上拥有一个“WebView”,......所以我正在寻找一种可以在任何地方都可以使用的解决方案......
  • 好吧,我只看到 2 种可能性(但肯定还有更多)。使用电话间隙进行开发或使用 websockets。 C# 中有一些 WebSocket 实现。您将能够以 json 格式交换数据。这里有一篇关于 Websockets 和 C# 的文章divyen.wordpress.com/2012/06/13/…
  • 您可以在您的代码中构建一个低端 HTTP 服务器并将其托管在本地端口上。正如 Didier 建议的那样,您可以使用 JSON 来促进客户端/服务器数据传输。
  • 再次感谢您的回答。其实我并不想用PhoneGap,只是实现了PhoneGap原理的一个简单版。我会检查 Websockets

标签: javascript wpf communication


【解决方案1】:

请看How to: Implement Two-Way Communication Between DHTML Code and Client Application Code

基本上您需要在脚本代码中使用window.external 对象来访问公共属性和方法

HTML 代码:

<button onclick="window.external.Test('called from script code')">
    call client code from script code
</button>

您的 WPF 代码中的 C# 代码:

public void Test(String message)
{
    MessageBox.Show(message, "client code");
}

WPF 和 JavaScript 之间的通信需要完全信任,因此您需要添加以下代码:

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]
public class MainWindow
{
        public void Test(String message)
    {
        MessageBox.Show(message, "client code");
    }
}

【讨论】:

  • 感谢您的回答!事实上,我并不想使用 window.external,因为最终我会使用 Xamarin 来做一个跨平台的应用程序。 WebBrowser 将适用于 Windows,但 IOS 使用不支持 window.external (stevesaxon.me/posts/2011/…) 的 UIWebView,所以我需要一个适用于任何地方的解决方案,并且自定义 URL 有大小限制
  • 啊,我明白了。是的,你是正确的跨平台这行不通。
  • 不知道我该怎么做?也许通过向当前页面添加自定义标题并在 c# 中读取它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2013-12-30
  • 2020-05-18
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
相关资源
最近更新 更多