首页 > 代码库 > WPF加载HTML、WPF与JavaScript交互

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=http://www.mamicode.com/false;}//屏蔽鼠标右键     "A" && window.event.shiftKey)       		    window.event.returnValue = http://www.mamicode.com/false;                                   //屏蔽shift加鼠标左键新开一网页     "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=http://www.mamicode.com/false;}//屏蔽鼠标右键     "A" && window.event.shiftKey)       		        window.event.returnValue = http://www.mamicode.com/false;                                   //屏蔽shift加鼠标左键新开一网页     "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交互