在WPF中嵌入WebBrowser可視化頁面

来源:https://www.cnblogs.com/ZaraNet/archive/2019/07/31/11275828.html
-Advertisement-
Play Games

無論是哪種C/S技術,涉及數據可視化就非常的累贅了,當然大神也一定有,只不過面向大多數人,還是通過網頁來實現,有的時候不想把這兩個功能分開,一般會是客戶的原因,所以我們打算在WPF中嵌入WebBrowser,然後使用ECharts 完成複雜的圖表展示,其功能不亞於一個名為Devexpress的圖標庫 ...


  無論是哪種C/S技術,涉及數據可視化就非常的累贅了,當然大神也一定有,只不過面向大多數人,還是通過網頁來實現,有的時候不想把這兩個功能分開,一般會是客戶的原因,所以我們打算在WPF中嵌入WebBrowser,然後使用ECharts 完成複雜的圖表展示,其功能不亞於一個名為Devexpress的圖標庫,而且這東西還收費(呵呵),本文就對WebBrowser+ECharts進行了演示。

  首先下載一下Echats.js文件以及Jquery文件並且創建一個Html頁面,在我們項目的bin文件夾中。

在html中編輯,其中包括了幾個方法,是對C#代碼進行訪問的。

<!DOCTYPE html>
<html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml">
<!-- saved from url=(0013)about:internet -->
<head>
    <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=5,6,7,8,9,10,11, chrome=1" />
    <title>ECharts</title>
</head>
<body>
    <h1>html頁面</h1>
    <button Onclick="click1()" style="width:100px;height:20px">測試</button>
    <script>
        function click1()
        {
            window.external.ShowMsg("這是一條信息");
        }
    </script>
    <div id="main" style="width:1000px;height:500px;margin-left:-8px" />
    <script src="echats.js"></script>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script>
        myChart = echarts.init(document.getElementById('main'));
        option = {
            xAxis: {
                type: 'category',
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            },
            yAxis: {
                type: 'value'
            },
            series: [{
                data: [820, 932, 901, 934, 1290, 1330, 1320],
                type: 'line'
            }]
        };
        myChart.setOption(option);
    </script>
    <script>
        function SetOption(value) {
            var dataObj = JSON.parse(value);//將字元串轉換為json對象
            myChart.setOption(JSON.parse(dataObj));//將json對象轉換為[Object]
        }
        function jsShowHide(info) {
            if (info == 0) {
                myChart.clear();
            }
            else {
                myChart.setOption(option);
            }
        }
        function jsPushData(x, y) {
            option.xAxis.data.push(x);
            option.series[0].data.push(y);
            myChart.setOption(option);
        }
    </script>
</body>
</html>

   現在我們需要編輯一下我們的WPF窗體,在其中放入我們的瀏覽器,然後讓它顯示我們剛剛寫好的頁面。

<Window x:Class="EachartsDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EachartsDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="100"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="webBrowser" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="25"></TextBlock>
        <WebBrowser Grid.Row="1" Name="Web"></WebBrowser>
        <StackPanel Grid.Row="2" Orientation="Horizontal" VerticalAlignment="Center">
            <TextBlock Text="wpf按鈕: " FontSize="20"></TextBlock>
            <Button Grid.Row="2" Name="btnShowHide" Content="載入"  Click="btnShowHide_Click"></Button>
            <Button Grid.Row="2" Name="btnAddSeries" Content="追加" Margin="10,0,0,0" Click="btnPushData_Click"></Button>
            <Button Grid.Row="2" Name="btnSet" Content="重置" Margin="10,0,0,0" Click="SetOption">
            </Button>
        </StackPanel>
    </Grid>
</Window>

  在Windows標記中我們需要一個Load事件用於讓WebBrowser跳轉到相應的頁面。

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Web.Navigate(new Uri(Directory.GetCurrentDirectory() + "/Demo.html"));
        }

  最後我們還需要創建幾個方法,用於讓C#直接調用其中Js方法。

int show = 0;
        private void btnShowHide_Click(object sender, RoutedEventArgs e)
        {
            Web.InvokeScript("jsShowHide", show);
            if (show == 0) show = 1;
            else show = 0;
        }

        private void btnPushData_Click(object sender, RoutedEventArgs e)
        {
            Web.InvokeScript("jsPushData", "x", 1000,"y","200");
        }

        private void SetOption(object sender, RoutedEventArgs e)
        {
            string strobj = @"{""xAxis"":{""type"":""category"",""data"":[""Mon"",""Tue"",""Wed"",""Thu"",""Fri"",""Sat"",""Sun""]},""yAxis"":{""type"":""value""},""series"":[{""data"":[100,200,300,400,500,600,700],""type"":""line""}]}";
            var aa = JsonConvert.SerializeObject(strobj.Trim());
                Web.InvokeScript("SetOption",aa);
        }

  因為我們在xaml中把WebBrowser的name改成了Web,其中這個控制項自帶一個InvokeScript方法,就是來使用頁面寫好的Function,就這樣啟動~

   可見效果還可以,就現在我們要通過Js調用C#方法,首先編輯一個頁面可操作的類,我們創建 EchatsHelper ,必須在類上面標註特性,否則程式啟動不起來,因為WebBrowser是涉及一些安全性的東西,只要是在哪個類new出來,就必須在哪個類標註特性。

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    [System.Runtime.InteropServices.ComVisible(true)]//給予許可權並設置可見
    public class EchatsHelper
    {
        WebBrowser web;
        public EchatsHelper(WebBrowser web)
        {
            this.web = web;
        }
        public void ShowMsg(string Msg)
        {
            Console.WriteLine(Msg);
        }
    }

  最後我們在Load事件中創建應用程式對文檔文件的寄宿腳本訪問。

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Web.ObjectForScripting = new EchatsHelper(Web);
            Web.Navigate(new Uri(Directory.GetCurrentDirectory() + "/Demo.html"));
        }

  就這樣~我們測試一下~

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址:https://www.cnblogs.com/younShieh/p/11279420.html   項目中遇到一個難題,需要將上百個沒有顯示出來的Canvas存儲為圖片保存在本地。 1 . 查閱資料後(百度一下)後得知保存為本地圖片可以通過BitmapSource的 ...
  • 1、MVC中的TempData\ViewBag\ViewData區別? 答:頁面對象傳值,有這三種對象可以傳。 Temp:臨時的 Bag:袋子 (1) TempData 保存在Session中,Controller每次執行請求的時候,會從Session中先獲取 TempData,而後清除Sessio ...
  • 1、將一個值類型變數賦給另一個值類型變數時,將複製包含的值。引用變數的賦值只複製對對象的引用,而不複製對象本身。 2、值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType.但與引用類型相同的是,結構也可以實現介面。 3、值類型不可能包含null 值;然後,可空類型功 ...
  • 1.改變RectTransform的Left和Buttom offsetMax是一個Vector2類型 offsetMax.x即為RectTransform中的Left offsetMax.y即為RectTransform中的Buttom 2.改變RectTransform的Right和Top of ...
  • 1、Connection:主要是開啟程式和資料庫之間的連接。沒有利用連接對象將資料庫打開,是無法從資料庫中取得數據的。 Close和Dispose的區別,Close以後還可以Open,Dispose以後則不能再用。 2、Command:主要可以用來對資料庫發出一些指令,例如可以對資料庫下達查詢、新增 ...
  • 問道 面向Abp 在面向服務的時候,Session 幹嘛用? 先把Session 的作用說了,但是在微服務環境下給忽略了,相當於忽略了核心。 Session 只是個功能。就是根據Cookie 的SessionId 得到的一個KeyValue列表 實際上Session 就是一個緩存可以向寫東西,讀東西 ...
  • 之前做數據同步時,用過timer、window服務,現在不用那麼費事了,可以使用Quartz,並且配置靈活,使用cron表達式配置XML就可以。我用的是3.0.7版本支持.netcore。 首先創建一個.netcore控制台應用程式,添加Quartz、Quartz.Jobs、Quartz.Plugi ...
  • 1、元素屬性 XAML是一種聲明性語言,XAML編譯器會為每一個標簽創建一個與之對應的對象。對象創建出來之後要對它的屬性進行必要的初始化之後才有使用意義。因為XAML語言不能寫程式運行邏輯,所以一份XAML文檔除了使用標簽聲明對象,另外一個功能就是初始化對象的屬性了。在XAML中為對象屬性賦值共有兩 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...