如何使用 livecharts 库缩放和平移多个图表
How to zoom and pan multiple charts with livecharts library
我正在使用 beto-rodriguez 的 WPF 实时图表。我从 xml 文件中获取图表数据,然后我将图表一个接一个地绘制,表示数据的图表在 X 轴上具有相同数量的点,并且 ZOOM 和 PAN 启用 ch.Zoom = ZoomingOptions.X ;和 ch.Pan = PanningOptions.X;
我的问题是可以缩放或平移这些图表中的一个(无关紧要),并且所有图表都被缩放或平移,以便我垂直对齐所有图表的 X 轴?基本上,如果我在一个图表上缩放或平移,所有其他图表都应该同时缩放和平移相同的数量。
您需要做的是在每个图表的轴
上为事件"RangeChanged"创建一个事件处理程序
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Time" RangeChanged="Axis_RangeChanged" Separator="{x:Static lvc:DefaultAxes.CleanSeparator}" DisableAnimations="True" />
</lvc:CartesianChart.AxisX>
然后在事件处理程序中,您可以提取轴的新最小值和最大值,并将其应用于页面上的所有图表
private void Axis_RangeChanged(LiveCharts.Events.RangeChangedEventArgs eventArgs)
{
//sync the graphs
double min = ((Axis)eventArgs.Axis).MinValue;
double max= ((Axis)eventArgs.Axis).MaxValue;
this.lvcChart2.AxisX[0].MinValue = min;
this.lvcChart2.AxisX[0].MaxValue = max;
this.lvcChart.AxisX[0].MinValue = min;
this.lvcChart.AxisX[0].MaxValue = max;
//Repeat for as many graphs as you have
}
使用命令和绑定可能还有其他一些很酷的方法,但这至少会让你入门。
我设法在 X 轴上垂直平移和缩放。
首先,我创建了一个 class 来读取 xml 并创建为 livecharts 库准备的对象,然后我动态创建图表并为每个轴命名
Axis axisX = new Axis();
Axis axisY = new Axis();
axisX.Name = "X";
axisY.Name = "Y";
然后创建一个在范围变化时触发的事件,就像@Kevin Ross 提到的那样,在该事件循环的方法中遍历所有轴并检查轴的名称,然后像这样更改 minValue 和 maxValue:
void axisX_RangeChanged(LiveCharts.Events.RangeChangedEventArgs eventArgs)
{
double min = ((Axis)eventArgs.Axis).MinValue;
double max = ((Axis)eventArgs.Axis).MaxValue;
int p = 0;
string name;
foreach (Axis CartChart in FindVisualChildren<Axis>(TestGrid))
{
// do something with CartChart here
name = CartChart.Name;
if (name == "Y")
{
continue;
}
else if (name == "X")
{
CartChart.MinValue = min;
CartChart.MaxValue = max;
}
p++;
}
}
我正在使用 beto-rodriguez 的 WPF 实时图表。我从 xml 文件中获取图表数据,然后我将图表一个接一个地绘制,表示数据的图表在 X 轴上具有相同数量的点,并且 ZOOM 和 PAN 启用 ch.Zoom = ZoomingOptions.X ;和 ch.Pan = PanningOptions.X; 我的问题是可以缩放或平移这些图表中的一个(无关紧要),并且所有图表都被缩放或平移,以便我垂直对齐所有图表的 X 轴?基本上,如果我在一个图表上缩放或平移,所有其他图表都应该同时缩放和平移相同的数量。
您需要做的是在每个图表的轴
上为事件"RangeChanged"创建一个事件处理程序<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Time" RangeChanged="Axis_RangeChanged" Separator="{x:Static lvc:DefaultAxes.CleanSeparator}" DisableAnimations="True" />
</lvc:CartesianChart.AxisX>
然后在事件处理程序中,您可以提取轴的新最小值和最大值,并将其应用于页面上的所有图表
private void Axis_RangeChanged(LiveCharts.Events.RangeChangedEventArgs eventArgs)
{
//sync the graphs
double min = ((Axis)eventArgs.Axis).MinValue;
double max= ((Axis)eventArgs.Axis).MaxValue;
this.lvcChart2.AxisX[0].MinValue = min;
this.lvcChart2.AxisX[0].MaxValue = max;
this.lvcChart.AxisX[0].MinValue = min;
this.lvcChart.AxisX[0].MaxValue = max;
//Repeat for as many graphs as you have
}
使用命令和绑定可能还有其他一些很酷的方法,但这至少会让你入门。
我设法在 X 轴上垂直平移和缩放。 首先,我创建了一个 class 来读取 xml 并创建为 livecharts 库准备的对象,然后我动态创建图表并为每个轴命名
Axis axisX = new Axis();
Axis axisY = new Axis();
axisX.Name = "X";
axisY.Name = "Y";
然后创建一个在范围变化时触发的事件,就像@Kevin Ross 提到的那样,在该事件循环的方法中遍历所有轴并检查轴的名称,然后像这样更改 minValue 和 maxValue:
void axisX_RangeChanged(LiveCharts.Events.RangeChangedEventArgs eventArgs)
{
double min = ((Axis)eventArgs.Axis).MinValue;
double max = ((Axis)eventArgs.Axis).MaxValue;
int p = 0;
string name;
foreach (Axis CartChart in FindVisualChildren<Axis>(TestGrid))
{
// do something with CartChart here
name = CartChart.Name;
if (name == "Y")
{
continue;
}
else if (name == "X")
{
CartChart.MinValue = min;
CartChart.MaxValue = max;
}
p++;
}
}