【问题标题】:Binding secondary YAxis to range and zoom from primary YAxis in Visiblox Chart将辅助 YAxis 绑定到 Visiblox Chart 中的主 YAxis 范围和缩放
【发布时间】:2013-05-29 15:11:45
【问题描述】:

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

简而言之:如何让图表在左侧和右侧显示相同的 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);

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

【问题讨论】:

    标签: zooming axis visiblox


    【解决方案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();
            }
        }
    }
    

    【讨论】:

    • 请注意,我只将系列添加到图表中一次。它不关心将其绘制在哪个轴上。如果你不指定使用哪个轴,它将同时使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多