gpt4 book ai didi

c# - 在 X 轴中将 CartesianChart 与 DateAxis 和 DateModel 结合使用

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:46 25 4
gpt4 key购买 nike

我需要绘制一个图表,其中包含一系列随时间变化的值。值之间的时间段是不规则的(几秒钟)。为此,我正在使用库 LiveChart.Wpf,遵循 Date Time tutorial和来自 GitHub 的日期轴示例(DateAxisExample.xamlDateAxisExample.xaml.cs)。

这是 XAML:

<UserControl x:Class="Wpf.Charts.SensorChart"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Left">
<lvc:CartesianChart.AxisX>
<lvc:DateAxis Title="Time"
InitialDateTime="{Binding InitialDateTime}"
Period="{Binding Period}"
SelectedWindow="{Binding SelectedWindow}"
LabelFormatter="{Binding Formatter}">
</lvc:DateAxis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
</Grid>
</UserControl>

这是我背后的代码:

using LiveCharts;
using LiveCharts.Configurations;
using LiveCharts.Helpers;
using LiveCharts.Wpf;
using System;
using System.Windows.Controls;

namespace Wpf.Charts
{
public partial class SensorChart : UserControl
{
public SeriesCollection SeriesCollection { get; set; }
public DateTime InitialDateTime { get; set; }
public PeriodUnits Period { get; set; }
public IAxisWindow SelectedWindow { get; set; }
private Func<double, string> Formatter { get; set; }

public SensorChart()
{
InitializeComponent();
this.SetChartModelValues();
this.DataContext = this;
}

private void SetChartModelValues()
{
var dayConfig = Mappers.Xy<ChartModel>()
.X(dayModel => (double)dayModel.DateTime.Ticks / TimeSpan.FromSeconds(1).Ticks)
.Y(dayModel => dayModel.Value);

DateTime now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second);

this.SeriesCollection = new SeriesCollection(dayConfig)
{
new LineSeries()
{
Values = new ChartValues<ChartModel>()
{
new ChartModel(now.AddSeconds(5), 3),
new ChartModel(now.AddSeconds(10), 6),
new ChartModel(now.AddSeconds(15), 8),
new ChartModel(now.AddSeconds(20), 4),
new ChartModel(now.AddSeconds(55), 7),
new ChartModel(now.AddSeconds(60), 2),
new ChartModel(now.AddSeconds(65), 6),
new ChartModel(now.AddSeconds(70), 8),
new ChartModel(now.AddSeconds(75), 4),
new ChartModel(now.AddSeconds(80), 7),
new ChartModel(now.AddSeconds(105), 3),
new ChartModel(now.AddSeconds(110), 6),
new ChartModel(now.AddSeconds(115), 8),
new ChartModel(now.AddSeconds(120), 4),
new ChartModel(now.AddSeconds(155), 7),
new ChartModel(now.AddSeconds(160), 2),
new ChartModel(now.AddSeconds(165), 6),
new ChartModel(now.AddSeconds(170), 8),
new ChartModel(now.AddSeconds(175), 4),
new ChartModel(now.AddSeconds(180), 7),
}
}
};
//foreach ()

this.InitialDateTime = now;
this.Period = PeriodUnits.Seconds;
this.SelectedWindow = new DateAxisWindows.FifteenSecondsAxisWindow();
this.Formatter = this.DateLabelFormater;
}

private string DateLabelFormater(double value)
{
DateTime dateTime = new DateTime((long)(value * TimeSpan.FromSeconds(1).Ticks));
return dateTime.ToString("HH:mm:ss");
}
}

public class ChartModel
{
public DateTime DateTime { get; set; }
public double Value { get; set; }

public ChartModel(DateTime dateTime, double value)
{
this.DateTime = dateTime;
this.Value = value;
}
}
}

但是当我运行该应用程序时,它会显示 4036 年的日期。你知道发生了什么吗?

最佳答案

如果你想显示实际值,试试这个:

public partial class SensorChart : UserControl
{
public SeriesCollection SeriesCollection { get; set; }
public DateTime InitialDateTime { get; set; }
public Func<double, string> Formatter { get; set; }

public SensorChart()
{
InitializeComponent();
this.SetChartModelValues();
this.DataContext = this;
}

private void SetChartModelValues()
{
var dayConfig = Mappers.Xy<ChartModel>()
.X(dayModel => dayModel.DateTime.Ticks)
.Y(dayModel => dayModel.Value);


DateTime now = DateTime.Now;

this.SeriesCollection = new SeriesCollection(dayConfig)
{
new LineSeries()
{
Values = new ChartValues<ChartModel>()
{
new ChartModel(now.AddSeconds(5), 3),
new ChartModel(now.AddSeconds(10), 6),
new ChartModel(now.AddSeconds(15), 8),
new ChartModel(now.AddSeconds(20), 4),
new ChartModel(now.AddSeconds(55), 7),
new ChartModel(now.AddSeconds(60), 2),
new ChartModel(now.AddSeconds(65), 6),
new ChartModel(now.AddSeconds(70), 8),
new ChartModel(now.AddSeconds(75), 4),
new ChartModel(now.AddSeconds(80), 7),
new ChartModel(now.AddSeconds(105), 3),
new ChartModel(now.AddSeconds(110), 6),
new ChartModel(now.AddSeconds(115), 8),
new ChartModel(now.AddSeconds(120), 4),
new ChartModel(now.AddSeconds(155), 7),
new ChartModel(now.AddSeconds(160), 2),
new ChartModel(now.AddSeconds(165), 6),
new ChartModel(now.AddSeconds(170), 8),
new ChartModel(now.AddSeconds(175), 4),
new ChartModel(now.AddSeconds(180), 7),
}
}
};

this.InitialDateTime = now;
this.Formatter = value => new DateTime((long)value).ToString("yyyy-MM:dd HH:mm:ss");
}
}

XAML:

<lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Left">
<lvc:CartesianChart.AxisX>
<lvc:Axis LabelFormatter="{Binding Formatter}"
MinValue="{Binding InitialDateTime.Ticks}">
</lvc:Axis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>

enter image description here

关于c# - 在 X 轴中将 CartesianChart 与 DateAxis 和 DateModel 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46427721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com