最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF利用LiveCharts實(shí)現(xiàn)動(dòng)態(tài)曲線圖繪制

 更新時(shí)間:2023年10月09日 08:57:12   作者:熊思宇  
LiveCharts是一個(gè)比較漂亮的WPF圖表控件,在數(shù)據(jù)發(fā)生變化后,還可以設(shè)置相對(duì)于的動(dòng)畫效果,本文就來(lái)利用LiveCharts繪制簡(jiǎn)單的動(dòng)態(tài)曲線圖吧

效果

在超過(guò)圖表的最大值后,X軸會(huì)自動(dòng)向右邊移動(dòng)

LiveCharts是一個(gè)比較漂亮的WPF圖表控件,在數(shù)據(jù)發(fā)生變化后,還可以設(shè)置相對(duì)于的動(dòng)畫效果,但也有自己的缺點(diǎn),比如數(shù)據(jù)量過(guò)大,可能會(huì)非常的卡,有一次,我在寫柱狀圖時(shí),將幾個(gè)柱子的值設(shè)置成15000,結(jié)果整整卡了幾十秒,在使用時(shí)還是需要注意的。

官方網(wǎng)站:點(diǎn)擊跳轉(zhuǎn)

開源代碼:點(diǎn)擊跳轉(zhuǎn)

安裝 LiveChart

在NuGet中直接搜索 LiveChart,選擇 LiveCharts.Wpf

在使用的界面當(dāng)中引用LiveChart.Wpf的類庫(kù) 

xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"

如果之前就沒有使用過(guò)LiveChart,可以用下面的小案例看看效果。

以直方圖、折線圖為例, 都屬于 CartesianChart 下的一種 Series 類型, 例如折線圖,如下:

<lvc:CartesianChart>
<lvc:CartesianChart.Series>
      <!--設(shè)置Series的類型為 Line 類型, 該類型提供了一些折線圖的實(shí)現(xiàn)-->
    <lvc:LineSeries/>  
</lvc:CartesianChart.Series>
</lvc:CartesianChart>

LinSeries 綁定數(shù)據(jù)設(shè)定Values即可, 可以看到Values單詞帶s,則代表這是一種復(fù)數(shù)集合類型,繼承于 IChartValues,所以最終綁定的數(shù)據(jù)符合 ChartValues 即可,下圖綁定了為數(shù)字類型的集合:

<lvc:CartesianChart>
 <lvc:CartesianChart.Series>
     <!--設(shè)置Series的類型為 Line 類型, 該類型提供了一些折線圖的實(shí)現(xiàn)-->
     <lvc:LineSeries Values="1,2,3,4,5,6"/>
     <lvc:LineSeries Values="2,4,6,8,10,12"/>
 </lvc:CartesianChart.Series>
</lvc:CartesianChart>

這里是 LiveChart 一些簡(jiǎn)單的使用方法,下面是用綁定數(shù)據(jù)的方式進(jìn)行顯示,在工作中,盡量使用數(shù)據(jù)綁定的方式,更適合項(xiàng)目的維護(hù)。

前端

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        Title="MainWindow" Width="700" Height="400" Loaded="Window_Loaded" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid Grid.Row="0" Background="AntiqueWhite">
            <Button Content="測(cè)試"  Margin="0,10,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        </Grid>
        <Grid Grid.Row="1">
            <lvc:CartesianChart Series="{Binding LineSeriesCollection}" LegendLocation="Right">
                <lvc:CartesianChart.AxisX>
                    <lvc:Axis LabelFormatter="{Binding CustomFormatterX}"  MaxValue="{Binding AxisXMax}" MinValue="{Binding AxisXMin}">
                        <lvc:Axis.Separator>
                            <lvc:Separator Step="1" />
                        </lvc:Axis.Separator>
                    </lvc:Axis>
                </lvc:CartesianChart.AxisX>
                <lvc:CartesianChart.AxisY>
                    <lvc:Axis LabelFormatter="{Binding CustomFormatterY}" MaxValue="{Binding AxisYMax}" MinValue="{Binding AxisYMin}">
                    </lvc:Axis>
                </lvc:CartesianChart.AxisY>
            </lvc:CartesianChart>
        </Grid>
    </Grid>
</Window>

后端

先定義一個(gè)數(shù)據(jù)更新的類 ViewModelBase

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApplication7
{
    /// <summary>
    /// 實(shí)現(xiàn)了屬性更改通知的基類
    /// </summary>
    public class ViewModelBase : System.ComponentModel.INotifyPropertyChanged
    {
        public virtual event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 屬性值變化時(shí)發(fā)生
        /// </summary>
        /// <param name="propertyName"></param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
        /// <summary>
        /// 屬性值變化時(shí)發(fā)生
        /// </summary>
        /// <param name="propertyName"></param>
        protected virtual void OnPropertyChanged<T>(System.Linq.Expressions.Expression<Func<T>> propertyExpression)
        {
            var propertyName = (propertyExpression.Body as System.Linq.Expressions.MemberExpression).Member.Name;
            this.OnPropertyChanged(propertyName);
        }
    }
}

后端代碼

using LiveCharts;
using LiveCharts.Wpf;
using System;
using System.Collections.Generic;
using System.Linq;
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;
namespace WpfApplication7
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        private Mode Modes = new Mode();
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.DataContext = Modes;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Modes.OnClick();
        }
    }
    public class Mode : ViewModelBase
    {
        public SeriesCollection LineSeriesCollection { get; set; }
        private double axisXMax;
        public double AxisXMax
        {
            get { return axisXMax; }
            set { axisXMax = value; this.OnPropertyChanged("AxisXMax"); }
        }
        private double axisXMin;
        public double AxisXMin
        {
            get { return axisXMin; }
            set { axisXMin = value; this.OnPropertyChanged("AxisXMin"); }
        }
        private double axisYMax;
        public double AxisYMax
        {
            get { return axisYMax; }
            set { axisYMax = value; this.OnPropertyChanged("AxisYMax"); }
        }
        private double axisYMin;
        public double AxisYMin
        {
            get { return axisYMin; }
            set { axisYMin = value; this.OnPropertyChanged("AxisYMin"); }
        }
        private Random Randoms = new Random();
        public Func<double, string> CustomFormatterX { get; set; }
        public Func<double, string> CustomFormatterY { get; set; }
        //綁定的X軸數(shù)據(jù)
        private ChartValues<double> ValueList { get; set; }
        //表中最大容納個(gè)數(shù)
        private int TabelShowCount = 10;
        private string CustomFormattersX(double val)
        {
            return string.Format("{0}天", val);
        }
        private string CustomFormattersY(double val)
        {
            return string.Format("{0}公斤", val);
        }
        public void OnClick()
        {
            int yValue = Randoms.Next(2, 1000);
            //向圖表中添加數(shù)據(jù)
            ValueList.Add(yValue);
            //確保Y軸曲線不會(huì)超過(guò)圖表
            int maxY = (int)ValueList.Max();
            AxisYMax = maxY + 30;
            //Y軸保持?jǐn)?shù)據(jù)居中(曲線會(huì)上下晃動(dòng))
            //int minY = ValueList.Count == 1 ? 0 : (int)ValueList.Min();
            //AxisYMin = minY - 10;
            //y軸的設(shè)置
            if (ValueList.Count > TabelShowCount)
            {
                AxisXMax = ValueList.Count - 1;
                AxisXMin = ValueList.Count - TabelShowCount;
            }
            //這里如果移除數(shù)組,圖表曲線會(huì)原地起伏,就沒有X軸移動(dòng)的動(dòng)畫效果了
            //if (ValueList.Count > 20)
            //{
            //    ValueList.RemoveAt(0);
            //}
        }
        public Mode()
        {
            AxisXMax = 10;
            AxisXMin = 0;
            AxisYMax = 10;
            AxisYMin = 0;
            ValueList = new ChartValues<double>();
            LineSeriesCollection = new SeriesCollection();
            CustomFormatterX = CustomFormattersX;
            CustomFormatterY = CustomFormattersY;
            LineSeries lineseries = new LineSeries();
            lineseries.DataLabels = true;
            lineseries.Values = ValueList;
            LineSeriesCollection.Add(lineseries);
        }
    }
}

運(yùn)行后一直點(diǎn)擊測(cè)試按鈕,就可以看到效果了。

到此這篇關(guān)于WPF利用LiveCharts實(shí)現(xiàn)動(dòng)態(tài)曲線圖繪制的文章就介紹到這了,更多相關(guān)WPF LiveCharts內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c# 數(shù)據(jù)類型占用的字節(jié)數(shù)介紹

    c# 數(shù)據(jù)類型占用的字節(jié)數(shù)介紹

    本篇文章主要是對(duì)c#中數(shù)據(jù)類型占用的字節(jié)數(shù)進(jìn)行了詳細(xì)的介紹。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#?創(chuàng)建vba用的類庫(kù)

    C#?創(chuàng)建vba用的類庫(kù)

    本文詳細(xì)介紹了如何在VBA中使用C#編寫的COM組件,首先創(chuàng)建一個(gè)C#項(xiàng)目,定義ComVisible特性和生成GUID,然后修改.csproj文件并編譯生成.dll文件,之后將該.dll文件注冊(cè)到系統(tǒng),最后在VBA代碼中使用CreateObject方法創(chuàng)建該對(duì)象并調(diào)用其方法
    2026-04-04
  • 詳談C++引用&和指針在作為形參時(shí)的區(qū)別

    詳談C++引用&和指針在作為形參時(shí)的區(qū)別

    下面小編就為大家?guī)?lái)一篇詳談C++引用&和指針在作為形參時(shí)的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • C#組合模式實(shí)例詳解

    C#組合模式實(shí)例詳解

    這篇文章主要介紹了C#組合模式,實(shí)例分析了C#實(shí)現(xiàn)組合模式的原理與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • C#文件和字節(jié)流的轉(zhuǎn)換方法

    C#文件和字節(jié)流的轉(zhuǎn)換方法

    這篇文章主要介紹了C#文件和字節(jié)流的轉(zhuǎn)換方法,涉及C#將文件以字節(jié)流形式讀取及將字節(jié)流寫入文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 支持多類型數(shù)據(jù)庫(kù)的c#數(shù)據(jù)庫(kù)模型示例

    支持多類型數(shù)據(jù)庫(kù)的c#數(shù)據(jù)庫(kù)模型示例

    本文為大家提供一個(gè)c#數(shù)據(jù)庫(kù)訪問(wèn)模型,支持多類型數(shù)據(jù)庫(kù),簡(jiǎn)單抽取數(shù)據(jù)庫(kù)訪問(wèn)函數(shù),大家參考使用吧
    2014-01-01
  • C#多線程之Thread中Thread.IsAlive屬性用法分析

    C#多線程之Thread中Thread.IsAlive屬性用法分析

    這篇文章主要介紹了C#多線程之Thread中Thread.IsAlive屬性用法,實(shí)例分析了C#判斷線程可用狀態(tài)的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#/Java連接sqlite與使用技巧

    C#/Java連接sqlite與使用技巧

    無(wú)意中發(fā)現(xiàn)的,C#/Java連接sqlite與使用技巧??戳讼拢€挺不錯(cuò)的。與大家分享一下。
    2013-04-04
  • C#讀寫xml文件方法總結(jié)(超詳細(xì)!)

    C#讀寫xml文件方法總結(jié)(超詳細(xì)!)

    項(xiàng)目中用到關(guān)于xml文件讀寫操,所以下面這篇文章主要給大家介紹了關(guān)于C#讀寫xml文件方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • c#中DataTable轉(zhuǎn)List的2種方法示例

    c#中DataTable轉(zhuǎn)List的2種方法示例

    這篇文章主要給大家介紹了關(guān)于c#中DataTable轉(zhuǎn)List的2種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

临颍县| 靖西县| 仁怀市| 延川县| 镇安县| 大关县| 湛江市| 娄烦县| 汕尾市| 蓬溪县| 大新县| 闻喜县| 万年县| 延川县| 明溪县| 垫江县| 乌兰察布市| 南川市| 环江| 镇雄县| 铜鼓县| 都兰县| 徐闻县| 大理市| 苏尼特右旗| 柞水县| 卓资县| 玛纳斯县| 高尔夫| 仪陇县| 仲巴县| 鄂托克前旗| 高唐县| 邛崃市| 田林县| 广水市| 会理县| 三穗县| 武隆县| 始兴县| 新蔡县|