Wpf嵌入Echart控件,在MVVM模式下使用

客户端上嵌入网页是常有的事,本文主要介绍Wpf嵌入Echart,并且封装成控件,可以用MVVM方式调用。(有位仁兄讲的好,控件内部怎么写都可以,但是用起来要方便)

老规矩,先上源码地址:AIStudio.Wpf.ECharts: Wpf嵌入echart

再来几张效果图:

  

暂时只做了这四种类型,下面为以线条图为例简单介绍一下。

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 {
             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({  x, height: y });
        }

        function click1() {
            //var main = document.getElementById('main')
            //main.style.width = "500px"
            //main.style.height = "500px"
            //myChart.resize({ height: 500, 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使用。

整个东西还是相对比较简单,欢迎大家下载源码。

作者:竹天笑

互相学习,提高自己。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVM模式下,PassWordBox的密码不能直接绑定到ViewModel的属性,因为密码是敏感信息,不应该以明文形式存储在内存中。因此,我们需要使用PasswordBox的SecureString属性来存储密码,并在ViewModel中创建一个SecureString类型的属性来接收密码。 首先,在XAML中,我们需要将PassWordBox的PasswordChanged事件与Command绑定,以便在密码发生变化时触发Command执行。例如: ``` <PasswordBox PasswordChanged="{Binding PasswordChangedCommand}" /> ``` 然后,在ViewModel中,我们需要创建一个SecureString类型的属性来接收密码,并创建一个Command来处理密码变化事件,例如: ``` public class LoginViewModel : INotifyPropertyChanged { private SecureString _securePassword; public SecureString SecurePassword { get { return _securePassword; } set { _securePassword = value; OnPropertyChanged(nameof(SecurePassword)); } } public ICommand PasswordChangedCommand => new RelayCommand<PasswordBox>((pb) => { SecurePassword = pb.SecurePassword; }); // INotifyPropertyChanged implementation... } ``` 在这个示例中,我们创建了一个SecurePassword属性来接收密码,并使用PasswordBox的SecurePassword属性将密码赋值给SecurePassword。我们还创建了一个PasswordChangedCommand来处理密码变化事件,该Command使用RelayCommand实现,并将PasswordBox作为参数传递。当密码发生变化时,Command会将SecurePassword属性设置为新密码。 需要注意的是,由于SecureString无法直接转换为字符串,因此我们需要在处理密码时使用相应的方法来转换或处理SecureString。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值