LiveCharts文书档案-3始发-3类型和设置

通报Chart自动更新

你能够完成IObservableChartPoint接口,从而达成当自定义类型的性格改变的时候,Chart会自动举办更新。下贰个例子你将会看出
ObservableValue类型的概念,看看它是怎么在Value改变的时候公告Chart改变的。那么些很好精通,你只供给每一遍在设定Value属性的值的时候,触发三个PointChanged事件就足以了。

public class ObservableValue : IObservableChartPoint
{
    private double _value;
    public ObservableValue()
    {

    }

    public ObservableValue(double value)
    {
        Value = value;
    }

   public event Action PointChanged;
   public double Value
   {
       get { return _value; }
       set
       {
           _value = value;
           OnPointChanged();
       }
   }

   protected void OnPointChanged()
   {
       if (PointChanged != null) PointChanged.Invoke();
   }
}

本节内容完

LiveCharts文书档案-3初叶-3类型和设置

体系和装置

这一局地尤其的主要,涉及到LiveCharts的中坚构成单元的牵线
LiveChart可以绘制任何类型,甚至是自定义的门类,且不丢掉强类型语言的益处,原理一点也不细略,当您传递三个泛型集合的时候,LiveChart会拉取X和Y值(笛CarlChart),你不须要定义每一种品种来绘制它。库已经知晓怎么绘制,double,int,decimal,short
,float,long还有其它越发规划的连串,ObservableCollection,ObservablePoint,ScatterPoint,Date提姆ePoint,HeatPoint,OHLPoint,PolarPoint.所以的这个品种都能够在质量改变的时候通知chart进行翻新,下边包车型客车例子就动用了这几个品种,你也足以友善定义本身需求的品种。

var doubleValues = new ChartValues<double> { 1, 2 ,3 };
var intValues = new ChartValues<int> { 1, 2 ,3 };

//the observable value class is really helpful, it notifies the chart to update
//every time the ObservableValue.Value property changes
var observableValues = new ChartValues<LiveCharts.Defaults.ObservableValue> 
{ 
    new LiveCharts.Defaults.ObservableValue(1), //initializes Value property as 1
    new LiveCharts.Defaults.ObservableValue(2),
    new LiveCharts.Defaults.ObservableValue(3)
};

你能够小心到,chart总是使用X,Y坐标来绘制(笛Carl坐标系),不过多少个组double,int,long值库也能够绘制是怎么2回事?
很简单,X是那组数组当中的index,Y正是你传递的值。当然,那只是您选拔横向系列的时候是那样,如若你使用纵向类别,那么X就是传递的值,Y正是Index。

var myValues = new LiveCharts.ChartValues<double>
{
  10, //index 0
  6,  //index 1
  9,  //index 2
  2,  //index 3
  7   //index 4
}

实际上的坐标是:
美学原理 1

现已定义了拉取坐标的布局:
横向坐标:

new CartesianMapper<double>()
  .X((value, index) => index) //use the index as X
  .Y((value, index) => value) //use the value as Y

纵向坐标:

new CartesianMapper<double>()
  .X((value, index) => value) //use the value as X
  .Y((value, index) => index) //use the index as Y

X和Y只是对于笛CarlChart有必要,但是当你想要绘制2个雷达图(半径和角度)也许金融Chart的时候,该怎么布局?所以自个儿创制了四个Mappers类型,这些项目会回来多少个不易mapper的实例,有过多抉择,Xy,Financial,Bubble和Polar,上边包车型大巴mappers将会被代表为:

Mappers.Xy<double>()
  .X((value, index) => index) //use the index as X
  .Y((value, index) => value) //use the value as Y

上边是多重mappers,那么些是依照你的气象来设定的。

//X and Y
var mapper = Mappers.Xy<ObservablePoint>() //in this case value is of type <ObservablePoint>
    .X(value => value.X) //use the X property as X
    .Y(value => value.Y); //use the Y property as Y

//X, Y and Weight
var mapper = Mappers.Bubble<BubblePoint>()
                .X(value => value.X)
                .Y(value => value.Y)
                .Weight(value => value.Weight);

//Angle and Radius
var mapper = Mappers.Polar<PolarPoint>()
    .Radius(value => value.Radius) //use the radius property as radius for the plotting
    .Angle(value => value.Angle); //use the angle property as angle for the plotting

//Open, High, Low and Close
var mapper = Mappers.Financial<OhlcPoint>()
                .X((value, index) => index)
                .Open(value => value.Open)
                .High(value => value.High)
                .Low(value => value.Low)
                .Close(value => value.Close);

您可以由此各类措施设定mappers:
1.Global级别
那种艺术在您的应用程序级别保存设置,每便LiveCharts检查Chart
Values实例中的类型的时候,它都会接纳那么些mapper,除非塞里esCollection
mapper和Series mapper是null。

var mapper1 = Mappers.Xy<int>()
  .X((value, index) => index) 
  .Y(value => value);
LiveCharts.Charting.For<int>(mapper1, SeriesOrientation.Horizontal); //when horizontal

var mapper2 = Mappers.Xy<int>()
  .X(value => value) //use the value (int) as X
  .Y((value, index) => index);
LiveCharts.Charting.For<int>(mapper2, SeriesOrientation.Vertical); //when vertical

别的叁个例证正是自定义类型,ObseravableCollection类只含有七个属性,X和Y,请留意本次本身给横向和纵向使用了同一的装置,并从未传递第一个参数。

For<ObservablePoint>(Mappers.Xy<ObservablePoint>()
  .X((value, index) => value.X) 
  .Y(value => value.Y));`

假如这些还不是很精通,能够去源码里找到愈多细节。
2.Series Collection级别
但当您定义3个Series
Collection的时候,你也足以传递2个暗许的布置,那几个布局将会覆盖掉全局配置,除非Series级其他配备是null。

var mapper = Mappers.Xy<MyClass>().X(v => v.XProp).Y(v => v.YProp);
var seriesCollection = new SeriesCollection(mapper);
myChart.SeriesCollection = seriesCollection;

美学原理,3.特定的Series级别
末段,假若只是为着设定三个Series,你可以定义二个一定的mapper用于它,这一个配置会覆盖掉Global和Series
Collection级其他配备。

var mapper = Mappers.Xy<MyClass>().X(v => v.XProp).Y(v => v.YProp);
var pieSeries = new PieSeries(mapper);