我最近遇到了一个名为LiveChart的工具,并决定对其进行测试。
不幸的是,我在确定如何实时更新图表值方面遇到了一些问题。我非常确定这是一个干净而正确的方法,但我无法找到它。
我希望能够通过private void
或按钮更新值。
在我的代码中,我使用ToolStripMenu测试它。
[CODE]:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using LiveCharts;
using LiveCharts.WinForms;
using LiveCharts.Wpf;
using PokeShowdown_AccStats_T.Properties;
using LiveCharts.Defaults;
namespace PokeShowdown_AccStats_T
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//int val1 = int.Parse(Settings.Default.Value1);
var value1 = new ObservableValue(3);
var value2 = new ObservableValue(7);
var value3 = new ObservableValue(10);
var value4 = new ObservableValue(2);
//value1.Value = 5;
cartesianChart1.Series.Add(new LineSeries
{
Values = new ChartValues<ObservableValue> { value1, value2, value3, value4 },
StrokeThickness = 4,
StrokeDashArray = new System.Windows.Media.DoubleCollection(20),
Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(107, 185, 69)),
Fill = System.Windows.Media.Brushes.Transparent,
LineSmoothness = 0,
PointGeometry = null
});
cartesianChart1.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(34, 46, 49));
cartesianChart1.AxisX.Add(new Axis
{
IsMerged = true,
Separator = new Separator
{
StrokeThickness = 1,
StrokeDashArray = new System.Windows.Media.DoubleCollection(2),
Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(64, 79, 86))
}
});
cartesianChart1.AxisY.Add(new Axis
{
IsMerged = true,
Separator = new Separator
{
StrokeThickness = 1.5,
StrokeDashArray = new System.Windows.Media.DoubleCollection(4),
Stroke = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(64, 79, 86))
}
});
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void changeValue1ToolStripMenuItem_Click(object sender, EventArgs e)
{
Settings.Default.Value1 = "10";
Settings.Default.Save();
this.Text = Settings.Default.Value1;
}
private void changeValue1To3ToolStripMenuItem_Click(object sender, EventArgs e)
{
Settings.Default.Value1 = "3";
Settings.Default.Save();
this.Text = Settings.Default.Value1;
}
}
}
答案 0 :(得分:7)
Live-Charts试图保持简单。逻辑是使用您需要绘制的类型的泛型集合,然后像添加/删除或更新此集合中的任何元素一样简单,那么您的图表将会更新。
要回答您的问题,通常需要:
public partial class Form1 : Form
{
private ObservableValue value1;
public Form1()
{
InitializeComponent();
//int val1 = int.Parse(Settings.Default.Value1);
value1 = new ObservableValue(3);
//...
cartesianChart1.Series.Add(new LineSeries
{
Values = new ChartValues<ObservableValue> { value1, ... },
});
}
private void changeValue1ToolStripMenuItem_Click(object sender, EventArgs e)
{
value1.Value = 10;
Settings.Default.Value1 = "10";
Settings.Default.Save();
this.Text = Settings.Default.Value1;
}
}
然后该库将处理动画和更新
答案 1 :(得分:2)
注意:问题是关于LiveCharts。但这个答案是根据MSChart发布的。要查看有关LiveCharts的答案,请参阅其他答案。
图表支持数据绑定。使用数据绑定和更新数据源然后刷新图表。例如:
DataTable table = new DataTable();
Random random = new Random();
private void Form1_Load(object sender, EventArgs e)
{
table.Columns.Add("X", typeof(int));
table.Columns.Add("Y", typeof(int));
for (int i = 0; i < 10; i++)
table.Rows.Add(i+1, random.Next(100));
chart1.Series[0].ChartType =
System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
chart1.Series[0].XValueMember = "X";
chart1.Series[0].YValueMembers = "Y";
chart1.DataSource = table;
chart1.ChartAreas[0].AxisX.Interval = 1;
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = 10;
chart1.ChartAreas[0].AxisY.Interval = 10;
chart1.ChartAreas[0].AxisY.Minimum = 0;
chart1.ChartAreas[0].AxisY.Maximum = 100;
chart1.DataBind();
var timer = new Timer() { Interval= 300};
timer.Tick += timer_Tick;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
table.Rows[i][1]= random.Next(100);
chart1.DataBind();
}
答案 2 :(得分:0)
您好,对于饼图,您可以通过以下简单的方式上传值:
后面的代码:
/// <summary>
/// Interaction logic for StatusChart.xaml
/// </summary>
public partial class StatusChart : UserControl
{
#region - Values -
private List<Double> values;
public List<Double> Values
{
get => values;
set
{
if (value is null) throw new NullReferenceException();
if (value.Count > PieChart.Series.Count) throw new IndexOutOfRangeException();
for(int serie = 0; serie < PieChart.Series.Count; serie++)
{
PieChart.Series[serie].ActualValues[0] = values[serie];
}
PieChart.Series.ForEach((i, s) => s.ActualValues[0] = value[i]);
}
}
#endregion
public StatusChart()
{
InitializeComponent();
values = Enumerable.Repeat(1D, PieChart.Series.Count).ToList();
PointLabel = chartPoint => string.Format(new CultureInfo("en-US"), "{0:#0}s", chartPoint.Y);
GridRoot.DataContext = this;
}
public Func<ChartPoint, string> PointLabel { get; set; }
/// <summary>
/// method to enalrge the slice (part of pie chart)
/// </summary>
/// <param name="sender"></param>
/// <param name="chartpoint"></param>
private void Chart_OnDataClick(object sender, ChartPoint chartpoint)
{
var chart = (LiveCharts.Wpf.PieChart)chartpoint.ChartView;
//clear selected slice.
foreach (PieSeries series in chart.Series)
series.PushOut = 0;
var selectedSeries = (PieSeries)chartpoint.SeriesView;
selectedSeries.PushOut = 7;
}
}
和xaml代码:
<UserControl x:Class="StatusChart"
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="500"
d:DataContext="{d:DesignInstance local:StatusChart}">
<Grid x:Name="GridRoot">
<lvc:PieChart x:Name="PieChart" LegendLocation="Bottom" DataClick="Chart_OnDataClick" Hoverable="False"><!-- DataTooltip="{x:Null}">-->
<lvc:PieChart.Series>
<lvc:PieSeries Title="serie1"
Values="1" DataLabels="True" LabelPoint="{Binding PointLabel}">
</lvc:PieSeries>
<lvc:PieSeries Title="serie2"
Values="1" DataLabels="True" LabelPoint="{Binding PointLabel}">
</lvc:PieSeries>
<lvc:PieSeries Title="serie3" Values="1" DataLabels="True"
LabelPoint="{Binding PointLabel}"/>
<lvc:PieSeries Title="serie4" Values="1" DataLabels="True"
LabelPoint="{Binding PointLabel}">
</lvc:PieSeries>
<lvc:PieSeries Title="serie4" Values="1" DataLabels="True"
LabelPoint="{Binding PointLabel}">
</lvc:PieSeries>
</lvc:PieChart.Series>
</lvc:PieChart>
</Grid>
仅在窗口wpf测试中尝试将控件放到这几行:
var temporalSc = Enumerable.Repeat(1D, StatusChart.PieChart.Series.Count).ToList();
for (var i = 0; i < StatusChart.PieChart.Series.Count; i++)
{
temporalSc[i] += rnd.Next(1, 87);
}
StatusChart.Values.Clear();
StatusChart.Values = temporalSc;