65.9K
CodeProject 正在变化。 阅读更多。
Home

MSChart 扩展 - 缩放和平移控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (25投票s)

2012年4月3日

MIT

5分钟阅读

viewsIcon

181082

downloadIcon

13837

为 MSChart 实现缩放和平移控件

也可通过 NuGet 和 GitHub 获取。

更新

MSChart 扩展已更新至 **2.2.0 版本**。新功能将在以下文章中描述

引言

本文介绍了一个名为“**MSChart 扩展**”的扩展类,该类旨在扩展 Visual Studio 中 WinForms 应用程序的 Microsoft Chart (MSChart) 控件的功能。

背景

Visual Studio 中的 Microsoft Chart (MSChart) 是一个出色的 Windows Forms (WinForms) 控件,用于为独立应用程序创建图表。但是,可以添加和改进一些功能,使其更用户友好。

在处理大量数据时,缩放和平移是图表的两个常见功能。不幸的是,没有简单的方法可以在 MSChart 中启用这两个功能。尽管有一个内置的缩放控件,但它并不非常用户友好,如下文所述。另一方面,没有平移功能。我在网上搜索过,但找不到任何可靠的解决方案。

我尝试通过编写自定义代码来实现 MSChart 中的这两个功能,是的,这是可能的。我没有将相同的代码片段一遍又一遍地复制到我需要的每个项目中,而是创建了这个 MSChart 扩展类,它将所有这些附加功能放在一个单独的程序集中,可以简单地添加为引用。

功能列表

  • 快速清除数据
  • 窗口缩放和缩小
  • 平移
  • 显示/隐藏系列

快速清除数据

MSChart 有一个影响大多数用户的已知问题,那就是清除数据点的速度。在处理大量数据时,这个问题会变得更糟。Microsoft 和网络用户已经发布了针对此问题的解决方法。(原始链接

MSChart 扩展中已实现此功能的扩展方法,如下所示:

internal static class MSChartExtension
{
    public static void ClearPoints(this Series sender)
    {
        sender.Points.SuspendUpdates();
        while (sender.Points.Count > 0)
            sender.Points.RemoveAt(sender.Points.Count - 1);
        sender.Points.ResumeUpdates();
        sender.Points.Clear(); //NOTE 1
    }
}

**注意 1**:我在函数末尾添加了一行 `Points.Clear()`,以确保在下一次绘图时图表轴正确更新。如果不添加此行,我观察到在调用 `ClearPoints()` 后立即绘制新数据点时,将使用先前的轴设置。

要使用此功能,只需从图表系列调用 `ClearPoints()` 即可。

//Clear Data Points (Extension)
myChart.Series[0].ClearPoints();

窗口缩放

这是缩放控件的改进版本,提供缩小(全视图)功能,而不是使用 MSChart 中的内置缩放控件。重新创建此功能的主要原因是缩小非常麻烦,您需要通过单击轴上的按钮来单独缩小每个轴,次数等于您放大的次数。此外,内置控件似乎与注释效果不佳。

**注意**:当图表被缩放时,缩小功能可在弹出菜单中找到。

平移

平移允许用户使用鼠标移动缩放窗口。这比移动水平和垂直滚动条要好得多。

显示/隐藏系列

有时,为了进行数据比较,有必要绘制带有多个系列的图表。但是,当多个系列重叠时,很难可视化每个单独系列的数据。显示和隐藏系列功能提供了根据需要隐藏每个系列的灵活性。MSChart 扩展将自动检测图表中使用的系列数量,无需进行任何设置即可使用此功能。每个系列都可以从上下文菜单中隐藏/显示。

注释(1.2.0 版本)

在 1.2.0 版本中添加了用于创建图表注释的扩展方法,如下所示:

  • DrawHorizontalLine
  • DrawVerticalLine
  • DrawLine
  • DrawRectangle
  • DrawText

在运行时向 MSChart 添加注释的标准方法是创建一个注释对象并将其添加到图表的注释列表中。添加一个注释通常涉及几行代码,因为我们需要覆盖其中一些默认属性才能在图表中正确显示注释。

使用上面提供的扩展方法,可以通过单个函数调用轻松添加注释。颜色、线宽、线型和位置作为输入参数公开。
上面列出的函数只是几种常用的注释类型。您可以使用类似的方法为其他类型的注释创建类似的函数。

**注意**:请注意,这些函数用于向具有主轴的第一个图表区域添加注释。

下面的代码显示了向图表添加水平线的示例。`ClipToChartArea`、`AxisXName`、`YAxisName` 和 `IsInfinite` 是我们需要覆盖其默认值的属性。`AxisXName` 和 `YAxisName` 是隐藏属性,在 IntelliSense 中不可见。

自定义注释名称应在注释添加到注释列表后分配。因为在将对象添加到注释列表时,`Name` 属性将被自动生成的值覆盖。

     public static void DrawHorizontalLine(this Chart sender, double y, 
        Drawing.Color lineColor, string name = "",
        int lineWidth = 1, ChartDashStyle lineStyle = ChartDashStyle.Solid)
    {
        HorizontalLineAnnotation horzLine = new HorizontalLineAnnotation();
        string chartAreaName = sender.ChartAreas[0].Name;
        horzLine.ClipToChartArea = chartAreaName;
        horzLine.AxisXName = chartAreaName + "\\rX";
        horzLine.YAxisName = chartAreaName + "\\rY";
        horzLine.IsInfinitive = true;
        horzLine.IsSizeAlwaysRelative = false;

        horzLine.Y = y;
        horzLine.LineColor = lineColor;
        horzLine.LineWidth = lineWidth;
        horzLine.LineDashStyle = lineStyle;
        sender.Annotations.Add(horzLine);

        if (!string.IsNullOrEmpty(name)) horzLine.Name = name;
    } 

Using the Code

要使用此扩展包,只需将 MSChart 程序集添加到项目的引用中即可。可以通过以下函数调用启用附加功能和专用上下文菜单。

    private void AttachChartControl()
    {
        //Enable Extension Functions and Context Menu
        myChart.EnableZoomAndPanControls(ChartCursorSelected, ChartCursorMoved);
    }
        
    private void ChartCursorSelected(double x, double y)
    {
        txtChartSelect.Text = x.ToString("F4") + ", " + y.ToString("F4");
    }
    private void ChartCursorMoved(double x, double y)
    {
        txtChartValue.Text = x.ToString("F4") + ", " + y.ToString("F4");
    }  

`ChartCursorSelected` 和 `ChartCursorMoved` 是两个可选的回调,用于在图表坐标更改时通知父级。当选择了图表区域中的一个点时,将调用 `ChartCursorSelected`,而当鼠标在图表区域中移动时,将触发 `ChartCursorMoved`。这两个回调中的 x 和 y 值是 X 轴和 Y 轴的值。目前硬编码为使用主轴。

可以通过调用以下函数来撤销此操作

    //Disable Extension Functions and restore chart settings
    myChart.DisableZoomAndPanControls();

MSChart 扩展带有一个内置的弹出菜单,允许用户在运行时使用缩放和平移控件等功能。可以通过上下文菜单访问缩放、平移、选择和系列隐藏/显示等所有功能。当启用缩放和平移控件的图表右键单击鼠标时,将显示此上下文菜单,如上所示。

未来改进

  • 为选择工具和回调函数添加在主/次轴之间选择的选项。
  • 如果存在,将 MSChart 扩展的上下文菜单附加到用户定义的上下文菜单。
  • 实现 2 个光标以计算 2 个点之间的差异。

历史

  • 2012 年 4 月 3 日:初始发布(1.0.0 版本)
  • 2012 年 4 月 4 日:(更新)添加了回调函数说明和未来改进列表
  • 2012 年 7 月 18 日:(更新)添加了注释函数(1.2.0 版本)
  • 2012 年 7 月 19 日:修复了下载包
© . All rights reserved.