You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# LiveCharts库中使用时间作为X轴时遇类型转换异常问题

解决LiveCharts WinForms中X轴设为时间轴的类型转换问题

问题原因

你遇到的InvalidCastException本质是两个问题导致:

  • 初始化时Series的Values类型为ChartValues<double>,但你尝试添加ObservablePoint类型对象,二者类型不匹配
  • WinForms项目中误用了LiveCharts.Wpf.LineSeries,应该使用WinForms专属的LiveCharts.WinForms.LineSeries

解决方案步骤

1. 修改图表初始化代码

将Series的Values类型改为ChartValues<ObservablePoint>,并替换为WinForms适配的LineSeries:

// 确保引用LiveCharts.WinForms命名空间
Chart1.Series = new LiveCharts.SeriesCollection
{
    new LiveCharts.WinForms.LineSeries
    {
        Values = new LiveCharts.ChartValues<ObservablePoint> 
        { 
            new ObservablePoint(1, 3),
            new ObservablePoint(2, 5),
            new ObservablePoint(3, 7),
            // 按需添加初始XY点
        }
    },
};

// 可选:配置X轴标签格式化,显示秒数
Chart1.AxisX[0].LabelFormatter = value => $"{value:F2}s";
Chart1.AxisX[0].Title = "时间(秒)";
Chart1.AxisY[0].Title = "数据值";

2. 修改DataPlotterAsync方法

调整类型转换与数据添加逻辑,适配ObservablePoint类型:

private async Task DataPlotterAsync(double Data, TimeSpan DeltaT, string Data_Name, string X_Axis_Label, string Y_Axis_Label, LiveCharts.WinForms.CartesianChart Chart, Bunifu.Framework.UI.BunifuCheckbox related_Checkbox, NumericUpDown relatedNumericUpdown)
{
    await Task.Run(() =>
    {
        Chart.Invoke((MethodInvoker)(() =>
        {
            double X = DeltaT.TotalSeconds; // 直接转换为秒数,更直观
            // 转换为WinForms的LineSeries类型
            var series = (LiveCharts.WinForms.LineSeries)Chart.Series[0];
            
            // 添加XY坐标点
            series.Values.Add(new ObservablePoint(X, Data));

            // 调整X轴范围逻辑:基于实际时间值而非索引
            if (related_Checkbox.Checked)
            {
                var visiblePointCount = (int)relatedNumericUpdown.Value;
                if (series.Values.Count > visiblePointCount)
                {
                    var visiblePoints = series.Values.Skip(series.Values.Count - visiblePointCount).ToList();
                    Chart.AxisX[0].MinValue = visiblePoints.Min(p => p.X);
                    Chart.AxisX[0].MaxValue = visiblePoints.Max(p => p.X);
                }
            }
            else
            {
                if (series.Values.Count > 0)
                {
                    Chart.AxisX[0].MinValue = series.Values.Min(p => p.X);
                    Chart.AxisX[0].MaxValue = series.Values.Max(p => p.X);
                }
            }

            Chart.Update();
        }));
    });
}

额外说明

  • 确保项目已安装并引用LiveCharts.WinForms NuGet包,避免混用Wpf版本的组件
  • 如果需要显示具体DateTime时间,可将X值替换为DateTime的Ticks,再通过LabelFormatter转换为时间字符串:
// 假设X为DateTime类型的Ticks
Chart1.AxisX[0].LabelFormatter = value => new DateTime((long)value).ToString("HH:mm:ss");

内容的提问来源于stack exchange,提问作者Kian Farooghi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:30:27