0

YAxis と SecondaryYAxis の両方が同じ Range と Zoom を持つ単純なグラフを作成しようとしています。そこには2つの問題があります:

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 に 1 つのシリーズが表示され、SecondaryYAxis に別のシリーズが表示されている場合、両方のスケールまたは範囲が異なります。

2)SecondaryYAxisにシリーズが表示されていない場合(両方の軸に同じデータを表示したいので、SecondaryYAxisを使用しても意味がありません)、「未使用」のSecondaryYAxisにはラベルも目盛りも表示されません。

私の質問を簡単に言うと、グラフの左側と右側に同じ YAxis を表示するにはどうすればよいですか?

=======編集=======

OK、@ 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 に答える