0

我正在尝试制作一个简单的图表,其中 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 根本不显示标签或刻度。

简而言之:如何让图表在左侧和右侧显示相同的 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 中的绑定不起作用。也许有人可以详细说明?!

4

1 回答 1

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();
        }
    }
}
于 2013-05-30T16:32:44.533 回答