WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码原因:前段时间,公司项目中用到Visifire.Charts4.5.6控件,项目中要求随时可以控制动画效果,用于在大屏上面展示,很酷炫。过程:但是没有源码,于是写了一个方法用动画去控制数量动态增长,无奈效率太低,多实例几个Chart就卡到爆,放弃。没有源码,怎么办呢,无奈之下反编译了一下dll,刚开始用reflector反编译,发现编译出来的大部分都用不了。然后又用ILSpy反编译…

大家好,又见面了,我是你们的朋友全栈君。

原因:

前段时间,公司项目中用到Visifire.Charts4.5.6控件,项目中要求随时可以控制动画效果,用于在大屏上面展示,很酷炫。

过程:

但是没有源码,于是写了一个方法用动画去控制数量动态增长,无奈效率太低,多实例几个Chart就卡到爆,放弃。

没有源码,怎么办呢,无奈之下反编译了一下dll,刚开始用reflector反编译,发现编译出来的大部分都用不了。然后又用ILSpy反编译,生成的代码还是有错误,但是已然少很多,于是稍加改动,就可以通过编译了。

反编译出来的代码能运行,就成功一大半了,然后花了大半月时间调试源码,添加动态控制动画方法,控制动画的时间,最终成功,后面有效果和Demo。

动画功能完成了,但反编译出来的代码还是有一些问题,这种反编译出来有些符号识别不了导致运行出来的图表总是多出来一条线。这个对于强迫症的我来说很难受啊,于是又花了好几天功夫调试啊,各种方法使尽啊就是找不到问题所在,最后又拿出Visifire.Charts3.6.1的源码来一个一个对比差异,这两个版本差异较大,一时半会没弄出来,最后还是无意间发现反编译将i++调用了多次导致,修改之后,完全正确了,喜出望外啊,强迫症解决了,完美。

诞生:

为了区别原来的Visifire.Charts4.5.6,我将封装了动画控制,新编译出来的代码修改为了WPFVisifire.Charts4.6.1。

说了这么多,贴一些使用代码吧,后面附加Visifire.Charts3.6.1、Visifire.Charts4.5.6、WPFVisifire.Charts4.6.1

示例:

XAML:

<Window x:Class="VisifireDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vc="clr-namespace:Visifire.Charts;assembly=WPFVisifire.Charts"
        Title="MainWindow" Height="600" Width="800" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
    <Grid x:Name="grid" Background="#1E1E1E">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <WrapPanel x:Name="wrap" VerticalAlignment="Center">
            <ComboBox x:Name="cbChartType" Width="120" Height="40" SelectionChanged="cbChartType_SelectionChanged"/>
            <Button x:Name="btnChartSet" Width="100" Height="40" Content="图形设置" Click="btnChartSet_Click"/>
            <Button x:Name="btnTagSet" Width="100" Height="40" Content="标签设置" Click="btnTagSet_Click"/>
            <Button x:Name="btnRandomValue" Width="100" Height="40" Content="随机值" Click="btnRandomValue_Click"/>
            <Button x:Name="btnAnimated" Width="100" Height="40" Content="动画" Click="btnAnimated_Click"/>            
        </WrapPanel>
        <vc:Chart x:Name="chart" Grid.Row="1"/>
    </Grid>
</Window>

后代代码: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Visifire.Charts;

namespace VisifireDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private Axis NewAxis()
        {
            var axisLabels = new AxisLabels();
            axisLabels.FontColor = Brushes.White;
            var _axis = new Axis { AxisLabels = axisLabels };
            _axis.Grids.Add(new ChartGrid());
            return _axis;
        }

        /// <summary>
        /// 初始化图表控件
        /// </summary>
        private void InitChart()
        {
            this.chart.BorderBrush = Brushes.Transparent;
            this.chart.Background = Brushes.Transparent;
            this.chart.LightingEnabled = false;
            this.chart.ThemeEnabled = false;
            this.chart.ShadowEnabled = false;
            this.chart.View3D = true;
            this.chart.AnimationEnabled = true;//加载动画
            this.chart.AnimatedUpdate = true;//更新动画
            this.chart.AnimationDuration = 5.0;//动画时长

            var _axisX = NewAxis();
            var _axisY = NewAxis();
            _axisY.Suffix = "斤";
            _axisY.AxisMaximum = 200;
            _axisY.AxisMinimum = 0;

            this.chart.AxesX.Add(_axisX);
            this.chart.AxesY.Add(_axisY);

            this.chart.PlotArea = new PlotArea()
            {
                Background = Brushes.Transparent,
                ShadowEnabled = false
            };
        }

        /// <summary>
        /// 绑定数据
        /// </summary>
        private void BindingData()
        {
            this.chart.Series.Clear();
            this.chart.Titles.Clear();
            this.chart.Titles.Add(new Title() { Text = "标题", FontColor = Brushes.Tomato, FontSize = 14 });

            DataSeries dataSeries = new DataSeries();
            DataPointCollection list = new DataPointCollection();
            for (int i = 0; i < 9; i++)
            {
                DataPoint dataPoint = new DataPoint();
                dataPoint.Enabled = true;
                dataPoint.Exploded = false;
                dataPoint.AxisXLabel = "name" + i;
                dataPoint.YValue = (i + 1) * 10;
                dataPoint.Background = Brushes.Red;
                dataPoint.MouseLeftButtonDown += (ss, ee) => { dataPoint.Exploded = !dataPoint.Exploded; };
                list.Add(dataPoint);
            }
            dataSeries.DataPoints = list;
            dataSeries.LabelFontColor = Brushes.White;
            dataSeries.LabelAngle = 0;
            dataSeries.RenderAs = RenderAs.Column;
            dataSeries.LightingEnabled = true;
            dataSeries.LabelEnabled = true;
            this.chart.Series.Add(dataSeries);
        }

        /// <summary>
        /// 加载图表控件类型
        /// </summary>
        private void LoadChartType()
        {
            var es = Enum.GetNames(typeof(RenderAs));
            foreach (var item in es)
            {
                this.cbChartType.Items.Add(item);
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            this.LoadChartType();
            this.InitChart();
            this.BindingData();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void cbChartType_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            this.chart.Series[0].RenderAs = (RenderAs)Enum.Parse(typeof(RenderAs), this.cbChartType.SelectedItem.ToString());
        }

        private void btnChartSet_Click(object sender, RoutedEventArgs e)
        {
            var window = new ChartSetWindow(this.chart);
            window.Owner = this;
            window.Show();
        }

        private void btnTagSet_Click(object sender, RoutedEventArgs e)
        {
            var window = new TagSetWindow(this.chart);
            window.Owner = this;
            window.Show();
        }

        private void btnRandomValue_Click(object sender, RoutedEventArgs e)
        {
            foreach (var item in this.chart.Series)
            {
                foreach (var s in item.DataPoints)
                {
                    s.YValue = new Random().Next(0, 100);
                    Thread.Sleep(20);
                }
            }
        }

        private void btnAnimated_Click(object sender, RoutedEventArgs e)
        {
            this.chart.RenderAnimate();
        }
    }
}

运行效果:

 WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

WPF Visifire.Charts4.6.1使用教程 附含源码

更多效果,下载Demo运行看吧!后面持续更新更多WPF样式控件,欢迎关注哟!

Visifire.Charts3.6.1源码

Visifire.Charts4.5.6源码

Visifire.Charts4.6.1源码 包含Demo

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162788.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 完整javaEE学生信息管理系统[通俗易懂]

    完整javaEE学生信息管理系统[通俗易懂]基于javaweb的ssm学校教务管理系统(管理员,教师,学生)文章结构一、开发框架及业务方向1.开发环境2.开发框架3.整体业务二、项目结构及页面展示1.项目整体结构2.用户页面3.管理员页面***需要源码的加企鹅:671033846;备注CSDN即可******文章结构一、开发框架及业务方向1.开发环境操作系统不限:java特性,一套代码,导出运行jdk版本不限:推荐jdk1.8tomcat版本不限:推荐Tomcat8.0数据库mysql:版本不限,推荐mysql8.0以下开发工具:e

    2022年10月16日
  • Python 冒泡排序_python

    Python 冒泡排序_python要学习冒泡排序必须知道它的原理:冒泡排序算法的原理如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。例子:1,2,3,4,5,6就拿1到6来举例子吧!这里面有n个数字,你要对其进…

    2022年10月16日
  • VScode常用插件_AE必备插件

    VScode常用插件_AE必备插件这篇博客主要是我使用vscode过程中的插件汇总,使用了这么长时间,总想有个总结,也方便日后查看,这里我将我使用的插件分为基础、框架、工具三个类型。官网地址VSCode插件官网地址,里面有很多的插件可以使用。基础插件这部分插件主要是和html、css、js有关的。htmlCSSSupport这个插件支持以下语言,提供基础的语法知识编写辅助。这是插件地址htmllarav…

    2022年9月30日
  • OSPF原理及配置[通俗易懂]

    OSPF原理及配置[通俗易懂]OSPF原理及配置OSPF的特点OSPF运行原理OSPF区域及路由器身份OSPF区域OSPF身份OSPF邻居建立OSPF更新OSPF数据包类型DR、BDR的选举OSPF状态基本配置演示OSPF原理及配置OSPF(OpenShortestPassFirst,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议。OSP…

    2022年10月26日
  • altium designer怎么画圆弧_word怎么画小圆形

    altium designer怎么画圆弧_word怎么画小圆形1.概述近期在学PADS这个平台,禁止覆铜区域可以放置各种形状,而在AD一直用的是polygonpourcutout这个选项,似乎不能绘制出圆形呢?别着急,我们接着往下看,AD还是上手比较快的设计软件。2.步骤如上所述,一般我们在AD要禁止覆铜,或者挖去铜皮,一般都用polygonpourcutout:但涉及如下图(蓝色圆圈)这样的禁止覆铜,就不好操作了。…

    2022年9月24日
  • dijkstra算法求最短路例题_最短路问题算法

    dijkstra算法求最短路例题_最短路问题算法原题链接战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的

    2022年8月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号