客戶端上嵌入網頁是常有的事,本文主要介紹Wpf嵌入Echart,並且封裝成控件,可以用MVVM方式調用。(有位仁兄講的好,控件內部怎么寫都可以,但是用起來要方便)
老規矩,先上源碼地址:https://gitee.com/akwkevin/aistudio.-wpf.-echarts
再來幾張效果圖:
暫時只做了這四種類型,下面為以線條圖為例簡單介紹一下。
html網頁代碼如下,script里的函數是能被客戶端直接調用的,其中jsSetSize是在客戶端放大縮小的時候同步改變Echart的大小。
<!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> <style> #main { width: 97%; height: 97%; position: absolute; } </style> </head> <body> <div id="main" /> <script src="echarts.js"></script> <script> myChart = echarts.init(document.getElementById('main')); option = { xAxis: { type: 'category', data: [] }, yAxis: { type: 'value' }, series: [{ data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true }, { data: [], type: 'line', smooth: true } ] }; myChart.setOption(option); function jsShowHide(info) { if (info == 0) { myChart.clear(); } else { myChart.setOption(option); } } function jsPushData(x, y, index) { option.xAxis.data.push(x); option.series[index].data.push(y); myChart.setOption(option); } function jsPushXData(x) { option.xAxis.data.push(x); myChart.setOption(option); } function jsPushYData(y, index) { option.series[index].data.push(y); myChart.setOption(option); } function jsShiftData(x, y, index) { option.xAxis.data.shift(); option.series[index].data.shift(); myChart.setOption(option); } function jsShiftXData(x) { option.xAxis.data.shift(); myChart.setOption(option); } function jsShiftYData(y, index) { option.series[index].data.shift(); myChart.setOption(option); } function jsSetDatas(xArray, yArray, index) { option.xAxis.data = JSON.parse(xArray); option.series[index].data = JSON.parse(yArray); myChart.setOption(option); } function jsSetXDatas(xArray) { option.xAxis.data = JSON.parse(xArray); myChart.setOption(option); } function jsSetYDatas(yArray, type, index) { option.series[index].data = JSON.parse(yArray); option.series[index].type = type; myChart.setOption(option); } function jsSetSmooth(smooth, index) { option.series[index].smooth = smooth; myChart.setOption(option); } function jsSetSize(x, y) { var main = document.getElementById('main') main.style.width = x + "px" main.style.height = y + "px" myChart.resize({ width: x, height: y }); } function click1() { //var main = document.getElementById('main') //main.style.width = "500px" //main.style.height = "500px" //myChart.resize({ height: 500, width:500 }); window.external.ShowMsg("這是一條信息,來自js,調用了C#"); } </script> </body> </html>
XAML的代碼就是一個 WebBrowser 控件,用來顯示html網頁
<WebBrowser Name="Web"></WebBrowser>
C#調用的關鍵代碼
Web.InvokeScript("jsSetSize", (int)(this.ActualWidth * 0.97), (int)(this.ActualHeight * 0.97));//設置echart大小 Web.InvokeScript("jsSetXDatas", Newtonsoft.Json.JsonConvert.SerializeObject(Labels.Labels));//設置橫坐標的數據 Web.InvokeScript("jsSetYDatas", Newtonsoft.Json.JsonConvert.SerializeObject(values.Values), values.Type, ValuesCollection.IndexOf(values));//設置縱坐標的數據
控件封裝好了,現在就是調用了Labels綁定橫坐標數據,ValuesCollection綁定縱坐標數據。
<controls:LineEchart Labels="{Binding Labels}" ValuesCollection="{Binding ValuesCollection}"/>
是不是非常簡單,輕松MVVM使用。
整個東西還是相對比較簡單,歡迎大家下載源碼。