1

问题:如何使用 RadCartesianChart 的当前视口找到最大和最小 x 轴值DateTimeCategoricalAxis

我可以很容易地找到数据集的最大值/最小值,如果我要使用 a (不幸的是不是一个选项),我可以简单地使用and 。然而使用是一个完全不同的故事,因为我无法准确地找到当前视口中的数据点。我什至尝试使用但无济于事。更何况,没有考虑到缩放大小,这就成了一个问题。DateTimeContinousAxisActualRangeActualVisibleRangeDateTimeCategoricalAxisPlotAreaClipPlotAreaClip

任何帮助将不胜感激!


这是我的代码的简化版本:

XAML:

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <telerik:RadCartesianChart ZoomChanged="Zooming">

        <telerik:RadCartesianChart.Behaviors>
           <telerik:ChartPanAndZoomBehavior DragMode="Pan" 
                                             PanMode="Both" 
                                             ZoomMode="None" />
        </telerik:RadCartesianChart.Behaviors>

        <telerik:RadCartesianChart.Series>
            <telerik:OhlcSeries ItemsSource="{Binding Bars}" 
                                OpenBinding="Open"
                                HighBinding="High"
                                LowBinding="Low"
                                CloseBinding="Close"
                                CategoryBinding="Date">
            </telerik:OhlcSeries>
         </telerik:RadCartesianChart.Series>

        <telerik:RadCartesianChart.HorizontalAxis>
            <telerik:DateTimeCategoricalAxis DateTimeComponent="Ticks" 
                                             ShowLabels="False"
                                             PlotMode="OnTicks" 
                                             MajorTickInterval="100">
            </telerik:DateTimeCategoricalAxis>
        </telerik:RadCartesianChart.HorizontalAxis>

        <telerik:RadCartesianChart.VerticalAxis>
            <telerik:LinearAxis HorizontalLocation="Right" 
                                RangeExtendDirection="Both"
                                Minimum="{Binding PriceMinimum, Mode=OneWay}"
                                Maximum="{Binding PriceMaximum, Mode=OneWay}"
                                MajorStep="{Binding PriceMajorStep, Mode=OneWay}" />
         </telerik:RadCartesianChart.VerticalAxis>

        <telerik:RadCartesianChart.Grid>
            <telerik:CartesianChartGrid MajorXLinesRenderMode="All" 
                                        MajorLinesVisibility="XY" />
        </telerik:RadCartesianChart.Grid>

    </telerik:RadCartesianChart>
</Grid>
</UserControl>

代码背后:

public void Zooming(object sender, ChartZoomChangedEventArgs e)
    {
        RadCartesianChart chart = sender as RadCartesianChart;
        if (chart != null)
        {
            //PlotAreaClip.Location.X (PlotAreaClip.X also works) to get left side of clip
            //PlotAreaClip.Right to get right side of clip
            DataTuple dtMin = chart.ConvertPointToData(new Point(chart.PlotAreaClip.Location.X - Math.Abs(chart.PanOffset), chart.PlotAreaClip.Y), chart.HorizontalAxis, chart.VerticalAxis);
            DataTuple dtMax = chart.ConvertPointToData(new Point(chart.PlotAreaClip.Right - Math.Abs(chart.PanOffset), chart.PlotAreaClip.Y), chart.HorizontalAxis, chart.VerticalAxis);
            object xMin = dtMin.FirstValue;
            object xMax = dtMax.FirstValue;
            //these numbers are VERY inconsistent, especially when you zoom in!
        }
    }

提到的 Telerik 控件可以在这里找到。

如果有人有任何建议,我将不胜感激!谢谢!

4

1 回答 1

2

在做了一些挖掘之后,我发现这个线程有以下解决方案:

private DataPoint[] FindFirstLastVisiblePoints(CategoricalSeries series)
{
    DataPoint firstPoint = null;
    DataPoint lastPoint = null;
    RadRect plotArea = this.radChart1.PlotAreaClip;

    foreach (DataPoint point in series.DataPoints)
    {
        if (point.LayoutSlot.IntersectsWith(plotArea))
        {
            if (firstPoint == null)
            {
                firstPoint = point;
            }
            lastPoint = point;
        }
    }

    return new DataPoint[] { firstPoint, lastPoint };
}

基本上,此方法采用当前PlotAreaClip并返回当前 ViewPort 中的第一个和最后一个数据点。我真的希望这对将来的其他人有所帮助!

于 2013-09-16T19:05:07.287 回答