将辅助YAxis绑定到范围并从Visiblox图表中的主YAxi​​s缩放

时间:2013-05-29 15:11:45

标签: zoom axis visiblox

我想要一个简单的图表,YAxis和SecondaryYAx都具有相同的范围和缩放。我有两个问题:

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上显示一个系列而在SecondaryYAx上显示的另一个系列都有不同的比例或范围。

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);

我不知道为什么当图表放在TabControl中时,xaml中的绑定不起作用。也许有人可以详细说明一下?!

1 个答案:

答案 0 :(得分: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();
        }
    }
}