转至元数据结尾
转至元数据起始

放大图表使用户可以通过单击和拖动鼠标来选择要放大的区域,从而使他们能够以更细的粒度级别分析图表数据。

 

在FlexChart中,可以通过跟踪用户选择的区域然后基于所选区域设置轴的最大值和最小值来实现缩放。通过将鼠标的开始位置存储在MouseDown事件中,在MouseMove事件中更新选择区域,然后在用户释放鼠标按钮时(即在MouseUp事件中)最终确定缩放区域,  可以获取选定区域的边界。然后将以此方式确定的边界用于设置  每个轴的Min和  Max属性,从而显示缩放的图表。


CS
private void FlexChart1_Rendered(object sender, RenderEventArgs e)
{
    if (!_start.IsEmpty && !_last.IsEmpty)
    {
        // draw selection
        var p1 = _start;
        var p2 = _last;
        e.Engine.SetFill(null);
        e.Engine.SetStroke(Brushes.Red);
        e.Engine.SetStrokeThickness(1);
        e.Engine.SetStrokePattern(new double[] { 3, 3 });
        e.Engine.DrawRect(Math.Min(p1.X, p2.X), Math.Min(p1.Y, p2.Y), Math.Abs(p2.X - p1.X), Math.Abs(p2.Y - p1.Y));
    }
}

private void FlexChart1_MouseDown(object sender, MouseEventArgs e)
{
    //Start Zooming
    _IsMouseDown = true;
    _start = e.Location;
    _last = Point.Empty;
}

private void FlexChart1_MouseMove(object sender, MouseEventArgs e)
{
    //Drawing zoom region rectangle borders and update selection range
    if (_IsMouseDown)
    {
        var ptCurrent = e.Location;
        var left = (int)flexChart1.PlotRect.Left;
        var right = (int)flexChart1.PlotRect.Right;
        var top = (int)flexChart1.PlotRect.Top;
        var bot = (int)flexChart1.PlotRect.Bottom;

        //Making sure that rectangle's end coordinate lies within FlexChart's PlotRect
        ptCurrent.X = ptCurrent.X < left ? left : ptCurrent.X > right ? right : ptCurrent.X;
        ptCurrent.Y = ptCurrent.Y < top ? top : ptCurrent.Y > bot ? bot : ptCurrent.Y;
        _last = ptCurrent;
        flexChart1.Refresh();
    }
}
private void FlexChart1_MouseUp(object sender, MouseEventArgs e)
{
    // Stop Zooming
    _IsMouseDown = false;
    if (!_last.IsEmpty)
    {
        var start = flexChart1.PointToData(_start);
        var last = flexChart1.PointToData(_last);
        //Update axes with new limits
        flexChart1.AxisX.Min = Math.Min(start.X, last.X);
        flexChart1.AxisX.Max = Math.Max(start.X, last.X);
        flexChart1.AxisY.Min = Math.Min(start.Y, last.Y);
        flexChart1.AxisY.Max = Math.Max(start.Y, last.Y);
    }
    // Clean up
    _start = _last = Point.Empty;
}
  • 无标签