WPF加载HTML、WPF与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调用JSprivate void Button_Click(object sender, RoutedEventArgs e){    this.wbrExam.InvokeScript("invokeScript", new object[] { "CS调用JS" });}

  

JS调用CSwindow.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加载HTML、WPF与JavaScript交互

相关文章:

你感兴趣的文章:

标签云: