WPF图表库LiveChart异常问题处理-System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围

问题:

在使用liveChart处理一个以时间为X轴的曲线时,遇到一个报错:指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:"Specified argument was out of the range of valid values. Arg_ParamName_Name" 指定的参数超出了有效值的范围

报错位置发生在框架内的代码PageSegmentCollection中,非自己写的代码,无法定位

代码:

在项目中使用MVVM模式,使用了自定义类型DataModel对折线图的xy轴进行绑定

DataModel:

csharp 复制代码
    public class DataModel
    {
        /// <summary>
        /// 时间,x轴
        /// </summary>
        public DateTime Time { get; set; }

        /// <summary>
        /// 值,y轴
        /// </summary>
        public double Value { get; set; }
    }

Xaml:

xml 复制代码
    <lvc:CartesianChart
        Background="White">
        <lvc:CartesianChart.Series>
            <lvc:LineSeries
                Title="值"
                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

csharp 复制代码
   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代码:

csharp 复制代码
 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 加入相同值的点

正常运行,没报错

csharp 复制代码
//测试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 加入相同对象

运行报错

csharp 复制代码
//测试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的情况

csharp 复制代码
 XFormatter = x =>
             x >= 0 ? default(DateTime).AddMinutes(x).ToString("MM-dd HH:mm") : "00-00 00:00";
相关推荐
EF@蛐蛐堂12 分钟前
【js】浏览器滚动条优化组件OverlayScrollbars
开发语言·javascript·ecmascript
TeamDev36 分钟前
如何在 DotNetBrowser 中使用本地 AI 模型
前端·后端·.net
代码中介商40 分钟前
C++ 仿函数(Functor)深度解析:从基础到应用
开发语言·c++
小杍随笔1 小时前
Rust桌面GUI框架:性能优化与实战避坑指南
开发语言·性能优化·rust
二哈赛车手1 小时前
新人笔记---项目中简易版的RAG检索后评测指标(@Recall ,Mrr..)实现
java·开发语言·笔记·spring·ai
格林威1 小时前
3D相机视觉检测:环境光太强,结构光点云全是噪点怎么办?
开发语言·人工智能·数码相机·计算机视觉·3d·视觉检测·工业相机
Rust语言中文社区1 小时前
【Rust日报】2026-05-02 Temper - 用 Rust 编写的 Minecraft 服务器项目发布 0.1.0 版
运维·服务器·开发语言·后端·rust
爱滑雪的码农2 小时前
Java基础十一 流(Stream)、文件(File)和IO
java·开发语言·python
叶小鸡2 小时前
Java 篇-项目实战-天机学堂(从0到1)-day11
java·开发语言
格林威2 小时前
线阵工业相机:线阵图像出现“波浪纹”,是机械振动还是编码器问题?
开发语言·人工智能·数码相机·计算机视觉·视觉检测·工业相机·线阵相机