WPF加载HTMLWPF与JavaScript交互
Posted sntetwt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF加载HTMLWPF与JavaScript交互相关的知识,希望对你有一定的参考价值。
目录
一、WebBrowser加载远程网页
二、WebBrowser加载本地网页,注:不可以加载本地样式CSS和脚本JS文件
三、WebBrowser隐藏网页的JavaScript错误
四、网页屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键
五、WPF程序与网页JavaScript交互
六、创建服务器,提供数据接口、Script、CSS文件
一、WebBrowser加载远程网页
wbrExam.Source = new Uri("http://cnblogs.com/sntetwt");
二、WebBrowser加载本地网页,注:不可以加载本地样式CSS和脚本JS文件
Uri uri = new Uri("pack://application:,,,/WPFSctipt;component/res/template.html", UriKind.Absolute); Stream source = Application.GetResourceStream(uri).Stream; wbrExam.NavigateToStream(source);
三、WebBrowser隐藏网页的JavaScript错误
this.wbrExam.SuppressScriptErrors(true);
/// <summary> /// WebBrowser隐藏网页的JavaScript错误 /// </summary> public static class WebBrowserExtensions { public static void SuppressScriptErrors(this WebBrowser webBrowser, bool hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; object objComWebBrowser = fiComWebBrowser.GetValue(webBrowser); if (objComWebBrowser == null) return; objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide }); } }
四、网页屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键
<script type="text/javascript"> //屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键 document.oncontextmenu = function(){event.returnValue=false;}//屏蔽鼠标右键 window.onhelp = function(){return false} //屏蔽F1帮助 document.onkeydown = function() { if ((window.event.altKey)&& ((window.event.keyCode==37) || //屏蔽 Alt+ 方向键 ← (window.event.keyCode == 39))) { //屏蔽 Alt+ 方向键 → event.returnValue = false; return false; } /* 注:这还不是真正地屏蔽Alt+方向键, 因为Alt+方向键弹出警告框时,按住Alt键不放, 用鼠标点掉警告框,这种屏蔽方法就失效了。*/ if ((event.keyCode==8) || //屏蔽退格删除键 (event.keyCode==116) || //屏蔽 F5 刷新键 (event.ctrlKe && event.keyCode==82)) { //Ctrl + R event.keyCode=0; event.returnValue=false; } if (event.keyCode==122){event.keyCode=0;event.returnValue=false;} //屏蔽F11 if (event.ctrlKey && event.keyCode==78) event.returnValue=false; //屏蔽Ctrl+n if (event.shiftKey && event.keyCode==121)event.returnValue=false; //屏蔽shift+F10 if (window.event.srcElement.tagName == "A" && window.event.shiftKey) window.event.returnValue = false; //屏蔽shift加鼠标左键新开一网页 if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4 window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px"); return false; } } </script>
五、WPF程序与网页JavaScript交互
public void Message(string str) { MessageBox.Show(str); } /// <summary> /// WebBrowser与JavaScript交互 /// </summary> [System.Runtime.InteropServices.ComVisible(true)] public class OprateBasic { private MainWindow instance; public OprateBasic(MainWindow instance) { this.instance = instance; } //提供给JS调用 public void HandleMessage(string p) { instance.Message(p); } } //CS调用JS private void Button_Click(object sender, RoutedEventArgs e) { this.wbrExam.InvokeScript("invokeScript", new object[] { "CS调用JS" }); }
JS调用CS window.external.HandleMessage("JS调用CS");
//提供给CS调用 function invokeScript(args) { alert(args); }
六、创建服务器,提供数据接口、Script、CSS文件
总结:因为加载HTML文件的时候,HTML没有路径,所以加载不了JS和CSS等外部文件
创建远程站点提供数据接口和外部文件
完整的CS程序如下
using System; using System.Collections.Generic; using System.Linq; using System.IO; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Reflection; namespace WPFSctipt { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_ContentRendered(object sender, EventArgs e) { //加载远程网页 //wbrExam.Source = new Uri("http://cnblogs.com/sntetwt"); Uri uri = new Uri("pack://application:,,,/WPFSctipt;component/res/template.html", UriKind.Absolute); Stream source = Application.GetResourceStream(uri).Stream; //WebBrowser隐藏网页的JavaScript错误 this.wbrExam.SuppressScriptErrors(true); //WebBrowser与JavaScript交互 this.wbrExam.ObjectForScripting = new OprateBasic(this); //加载本地HTML文件 wbrExam.NavigateToStream(source); } public void Message(string str) { MessageBox.Show(str); } /// <summary> /// WebBrowser与JavaScript交互 /// </summary> [System.Runtime.InteropServices.ComVisible(true)] public class OprateBasic { private MainWindow instance; public OprateBasic(MainWindow instance) { this.instance = instance; } //提供给JS调用 public void HandleMessage(string p) { instance.Message(p); } } //CS调用JS private void Button_Click(object sender, RoutedEventArgs e) { this.wbrExam.InvokeScript("invokeScript", new object[] { "CS调用JS" }); } } /// <summary> /// WebBrowser隐藏网页的JavaScript错误 /// </summary> public static class WebBrowserExtensions { public static void SuppressScriptErrors(this WebBrowser webBrowser, bool hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; object objComWebBrowser = fiComWebBrowser.GetValue(webBrowser); if (objComWebBrowser == null) return; objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide }); } } }
ASMX文件代码
<Window x:Class="WPFSctipt.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF加载HTML、WPF与JavaScript交互" Height="600" Width="800" ContentRendered="Window_ContentRendered"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="500"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <WebBrowser Grid.Row="0" Name="wbrExam" Height="500" VerticalAlignment="Top" Width="800"/> <Button Grid.Row="1" Content="CS调用JS" VerticalAlignment="Top" Width="200" Height="40" Margin="10" Click="Button_Click" /> </Grid> </Window>
HTML代码
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <title></title> <style type="text/css"> body{background:red;} .div{height:400px;} </style> <script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script> <script type="text/javascript"> //屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键 document.oncontextmenu = function(){event.returnValue=false;}//屏蔽鼠标右键 window.onhelp = function(){return false} //屏蔽F1帮助 document.onkeydown = function() { if ((window.event.altKey)&& ((window.event.keyCode==37) || //屏蔽 Alt+ 方向键 ← (window.event.keyCode == 39))) { //屏蔽 Alt+ 方向键 → event.returnValue = false; return false; } /* 注:这还不是真正地屏蔽Alt+方向键, 因为Alt+方向键弹出警告框时,按住Alt键不放, 用鼠标点掉警告框,这种屏蔽方法就失效了。*/ if ((event.keyCode==8) || //屏蔽退格删除键 (event.keyCode==116) || //屏蔽 F5 刷新键 (event.ctrlKe && event.keyCode==82)) { //Ctrl + R event.keyCode=0; event.returnValue=false; } if (event.keyCode==122){event.keyCode=0;event.returnValue=false;} //屏蔽F11 if (event.ctrlKey && event.keyCode==78) event.returnValue=false; //屏蔽Ctrl+n if (event.shiftKey && event.keyCode==121)event.returnValue=false; //屏蔽shift+F10 if (window.event.srcElement.tagName == "A" && window.event.shiftKey) window.event.returnValue = false; //屏蔽shift加鼠标左键新开一网页 if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4 window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px"); return false; } } </script> <script type="text/javascript"> $(function () { $("div").text("JavaScript被执行"); window.external.HandleMessage("JS调用CS"); }) function invokeScript(args) { alert(args); } </script> </head> <body> <div class="div"></div> </body> </html>
以上是关于WPF加载HTMLWPF与JavaScript交互的主要内容,如果未能解决你的问题,请参考以下文章
swift 笔记:iOS与JavaScript的交互(三):WKWebView 2.显示加载进度