Привязка вторичной оси Y к диапазону и масштабированию основной оси Y в диаграмме Visiblox

Я пытаюсь создать простую диаграмму с осями 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>

если у меня есть одна серия, отображаемая на оси Y, и другая серия, отображаемая на оси SecondaryYAxis, обе имеют разные масштабы или диапазоны.

2) Если у меня нет серий, отображаемых на SecondaryYAxis (поскольку я хочу, чтобы обе оси показывали одни и те же данные, нет смысла использовать SecondaryYAxis), «неиспользуемая» SecondaryYAxis вообще не показывает ни метки, ни тики.

Короче говоря, мой вопрос: Как я могу сделать так, чтобы диаграмма отображала одну и ту же ось Y слева и справа?

======= РЕДАКТИРОВАТЬ =======

Хорошо, как указал @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. Может быть, кто-то может поподробнее об этом?!


person Martin Booka Weser    schedule 29.05.2013    source источник


Ответы (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>

And the code file:

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();
        }
    }
}
person NielW    schedule 30.05.2013
comment
Обратите внимание, что я добавляю серию на диаграмму только один раз. Ему все равно, по какой оси его строить. Если вы не укажете, какую ось использовать, будут использоваться обе. - person NielW; 30.05.2013