问题:
在使用liveChart处理一个以时间为X轴的曲线时,遇到一个报错:指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:“Specified argument was out of the range of valid values. Arg_ParamName_Name” 指定的参数超出了有效值的范围
报错位置发生在框架内的代码PageSegmentCollection中,非自己写的代码,无法定位
代码:
在项目中使用MVVM模式,使用了自定义类型DataModel对折线图的xy轴进行绑定
DataModel:
public class DataModel{/// <summary>/// 时间,x轴/// </summary>public DateTime Time { get; set; }/// <summary>/// 值,y轴/// </summary>public double Value { get; set; }}
Xaml:
<lvc:CartesianChartBackground="White"><lvc:CartesianChart.Series><lvc:LineSeriesTitle="值"DataLabels="False"PointGeometrySize="0"Values="{Binding SeriesValues}" /></lvc:CartesianChart.Series><lvc:CartesianChart.AxisX><lvc:Axis LabelFormatter="{Binding XFormatter}" /></lvc:CartesianChart.AxisX></lvc:CartesianChart>
Xaml.cs
public MainWindow(){InitializeComponent();this.DataContext = new MainWindowViewModel();//构造函数实现模型跟图表xy的映射关系var mapper = Mappers.Xy<DataModel>().X(model => (model.Time - default(DateTime)).TotalMinutes) .Y(model => model.Value); Charting.For<DataModel>(mapper);}
ViewModel代码:
public class MainWindowViewModel : ObservableObject{private ChartValues<DataModel> _seriesValues;public ChartValues<DataModel> SeriesValues{get { return _seriesValues; }set { SetProperty(ref _seriesValues, value); }}public Func<double, string> XFormatter { get; set; }public MainWindowViewModel(){//设置x轴数据转换 - 需要处理值小于0的情况,会导致转换成DateTime失败报错XFormatter = x =>x >= 0 ? default(DateTime).AddMinutes(x).ToString("MM-dd HH:mm") : "00-00 00:00";SeriesValues = new ChartValues<DataModel>();//添加测试数据}}
测试问题
测试1 加入相同值的点
正常运行,没报错
//测试1 加入相同值的点
SeriesValues.Add(new DataModel { Value = 5, Time = DateTime.Parse("2024-1-30 19:00:00") }
);
SeriesValues.Add(new DataModel { Value = 5, Time = DateTime.Parse("2024-1-30 19:00:00") }
);
测试2 加入相同对象
运行报错
//测试2 加入相同对象
var point = new DataModel { Value = 5, Time = DateTime.Parse("2024-1-30 19:00:00") };
SeriesValues.Add(point);
SeriesValues.Add(point);
原因
在使用模型进行映射绑定的时候,同一个对象加入多次,导致报错。
解决方法:查看添加集合前的处理代码中,是否有可能导致重复加入的情况,进行处理避免。
其他常见的问题:
转换时间坐标的时候,处理小于0的情况
在没数据的时间,livechart会有默认自动的X轴坐标,-0.5,0,0.5,1等等,会有复数,需要处理一下x<0的情况
XFormatter = x =>x >= 0 ? default(DateTime).AddMinutes(x).ToString("MM-dd HH:mm") : "00-00 00:00";