Привязка вторичного YAxis к диапазону и изменению масштаба от первичного YAxis в диаграмме Visiblox
Я пытаюсь создать простую диаграмму с одинаковыми значениями Range и Zoom для YAxis и SecondaryYAxis. Там у меня две проблемы:
1) связывание Range и Zoom не работает должным образом:
<charts:Chart.YAxis>
<charts:LinearAxis LabelsPosition="Inside" x:Name="PrimaryAxis"/>
</charts:Chart.YAxis>
<charts:Chart.SecondaryYAxis>
<charts:LinearAxis LabelsPosition="Inside"
Range="{Binding ElementName=PrimaryAxis, Path=ActualRange}"
Zoom="{Binding ElementName=PrimaryAxis, Path=Zoom}"
AutoScaleToVisibleData="False"/>
</charts:Chart.SecondaryYAxis>
если у меня есть одна серия, отображаемая на YAxis, и другая серия, отображаемая на SecondaryYAxis, обе имеют разные масштабы или диапазоны.
2) Если у меня нет рядов, отображаемых на SecondaryYAxis (поскольку я хочу, чтобы обе оси отображали одни и те же данные, нет смысла использовать SecondaryYAxis), "неиспользуемый" SecondaryYAxis вообще не показывает Lables или Ticks.
Короче говоря, мой вопрос: как я могу позволить графику показывать один и тот же YAxis слева и справа?
======= РЕДАКТИРОВАТЬ =======
Хорошо, как указал @NielW, я не сделал ничего плохого. Проблема заключалась в том, что у меня есть диаграмма в TabControl, которая заставила диаграмму не устанавливать привязку, как указано в XAML. Не спрашивайте меня, почему, но вот исправление:
Вместо того, чтобы устанавливать привязку в XAML, я делаю это вручную из кода:
var primary = ResultChart.YAxis as LinearAxis;
var secondary = ResultChart.SecondaryYAxis as LinearAxis;
var rangeBinding = new Binding("ActualRange")
{
Source = primary
};
secondary.SetBinding(LinearAxis.RangeProperty, rangeBinding);
var zoomBinding = new Binding("Zoom")
{
Source = primary
};
secondary.SetBinding(LinearAxis.ZoomProperty, zoomBinding);
Я понятия не имею, почему привязка в xaml не работает, когда диаграмма помещается в TabControl. Может быть, кто-нибудь может уточнить это?!
1 ответ
Я получил ваш код на работу без проблем. Я изменил LabelsPosition на LabelPosition, чтобы он компилировался. Я полагаю, что проблема связана с кодом, который вы не показываете, например с тем, как вы добавляете серию в диаграмму.
Вот весь мой код Надеюсь, вы можете использовать это, чтобы ваш работает правильно.
<Window x:Class="Graphs.VBGraph"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:charts="clr-namespace:Visiblox.Charts;assembly=Visiblox.Charts"
Title="Visiblox" Height="350" Width="525" Loaded="Window_Loaded" SizeChanged="Window_SizeChanged">
<Grid>
<charts:Chart x:Name="Chart" >
<charts:Chart.Series>
<charts:RasterLineSeries AntiAliasingEnabled="True" ShowLine="False" ShowPoints="True">
<charts:RasterLineSeries.DefaultStyle>
<charts:LineSeriesStyle PointFill="Transparent" PointSize="3" PointStroke="Blue"/>
</charts:RasterLineSeries.DefaultStyle>
</charts:RasterLineSeries>
</charts:Chart.Series>
<charts:Chart.YAxis>
<charts:LinearAxis x:Name="PrimaryAxis" LabelPosition="Inside"/>
</charts:Chart.YAxis>
<charts:Chart.SecondaryYAxis>
<charts:LinearAxis LabelPosition="Inside"
Range="{Binding ElementName=PrimaryAxis, Path=ActualRange}"
Zoom="{Binding ElementName=PrimaryAxis, Path=Zoom}"
AutoScaleToVisibleData="False"/>
</charts:Chart.SecondaryYAxis>
</charts:Chart>
</Grid>
И файл кода:
using System;
using System.Windows;
using Visiblox.Charts;
namespace Graphs
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class VBGraph : Window
{
public VBGraph()
{
InitializeComponent();
}
private void draw()
{
if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
return;
Random r = new Random();
DataSeries<double, double> xData = new DataSeries<double, double>();
for (int i = 0; i < 500; i++)
{
xData.Add(new DataPoint<double, double>() { X = (double)r.Next((int)ActualWidth), Y = (double)r.Next((int)ActualHeight) });
}
Chart.Series[0].DataSeries = xData;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
draw();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
draw();
}
}
}