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

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

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

效果

在超過圖表的最大值后,X軸會自動向右邊移動

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

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

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

安裝 LiveChart

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

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

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

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

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

<lvc:CartesianChart>
<lvc:CartesianChart.Series>
      <!--設(shè)置Series的類型為 Line 類型, 該類型提供了一些折線圖的實現(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 類型, 該類型提供了一些折線圖的實現(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 一些簡單的使用方法,下面是用綁定數(shù)據(jù)的方式進(jìn)行顯示,在工作中,盡量使用數(shù)據(jù)綁定的方式,更適合項目的維護(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="測試"  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>

后端

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfApplication7
{
    /// <summary>
    /// 實現(xiàn)了屬性更改通知的基類
    /// </summary>
    public class ViewModelBase : System.ComponentModel.INotifyPropertyChanged
    {
        public virtual event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 屬性值變化時發(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>
        /// 屬性值變化時發(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; }
        //表中最大容納個數(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軸曲線不會超過圖表
            int maxY = (int)ValueList.Max();
            AxisYMax = maxY + 30;
            //Y軸保持?jǐn)?shù)據(jù)居中(曲線會上下晃動)
            //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ù)組,圖表曲線會原地起伏,就沒有X軸移動的動畫效果了
            //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)行后一直點擊測試按鈕,就可以看到效果了。

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

相關(guān)文章

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

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

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

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

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

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

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

    C#組合模式實例詳解

    這篇文章主要介紹了C#組合模式,實例分析了C#實現(xiàn)組合模式的原理與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    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ù)庫的c#數(shù)據(jù)庫模型示例

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

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

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

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

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

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

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

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

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

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

最新評論

嘉峪关市| 宝清县| 赫章县| 吴堡县| 南汇区| 久治县| 建瓯市| 邹平县| 秭归县| 申扎县| 临武县| 建瓯市| 东丰县| 潞城市| 太保市| 八宿县| 章丘市| 阿图什市| 马关县| 石渠县| 二连浩特市| 黎平县| 高唐县| 额敏县| 洪湖市| 华阴市| 建水县| 崇文区| 漳州市| 华蓥市| 社会| 腾冲县| 五台县| 桂东县| 三穗县| 历史| 阜新市| 尉氏县| 罗山县| 沂源县| 台前县|