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

MSChart 扩展版本 2

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2016 年 8 月 15 日

MIT

5分钟阅读

viewsIcon

23744

downloadIcon

2177

MSChart 扩展 2.0 带来新功能并支持多个图表区域。

引言

MSChart 扩展是 Microsoft Chart (MSChart) 控件在 Visual Studio 的 WinForms 应用程序中的一个扩展类。该工具首次发布于 2012 年 7 月(参见:MSChart 扩展 - 缩放和平移控件),旨在克服原始 MSChart 的一些限制。如果您是 MSChart 扩展的新用户,我们建议您先阅读之前的文章。

版本 2 基于版本 1 的代码库创建,引入了新功能和改进。
源代码也托管在 GitHub 上,编译后的包以 NuGet 包的形式发布。

警告:发布的版本 2 与版本 1 的向后兼容性不是 100%,详情如下。

已知问题

  • MSChart 扩展专为具有 X 轴和 Y 轴的图表类型设计,该扩展方法不适用于某些图表类型,如雷达图和饼图。
  • 已知缩放功能与对数轴(Log Axis)无法正常工作。我们决定禁用对数轴图表的扩展功能。
  • 日期时间轴 - 对于 X 轴值为日期时间格式的图表,缩放可能无法正常工作。

有什么新内容

支持多个图表区域

MSChart 扩展的初始实现是基于“每个图表对象只有一个图表”的假设创建的。由于一个图表对象中可以创建多个图表,我们决定重新审视原始实现以支持多个图表区域。不幸的是,这破坏了部分代码,使其与版本 1 的向后兼容性不是 100%。新增了 `ChartOption` 参数类,以容纳更多配置选项以及未来的扩展。

    public static void EnableZoomAndPanControls(this Chart sender,
            CursorPositionChanged selectionChanged,
            CursorPositionChanged cursorMoved,
            ZoomChanged zoomChanged = null, ChartOption option = null)

`CursorPositionChanged` 和 `ZoomChanged` 的方法签名已更新,如下所示:

版本 2(破坏性更改)

    public delegate void ZoomChanged(Chart sender);
    public delegate void CursorPositionChanged(Chart sender, ChartCursor cursor);

版本 1(先前实现)

    private delegate void CursorPositionChanged(double x, double y);
    private delegate void ZoomChanged(ChartExtents extents);

为了支持多个图表区域,我们需要知道鼠标指针当前位于哪个图表区域。实现了一个名为 `ChartAreaHitTest` 的私有方法来标识鼠标指针位置。此外,我们还创建了一个支持的图表类型列表,以便禁用非支持图表类型(如雷达图和饼图)的控件。当鼠标指针不在任何图表区域内时,我们也会禁用扩展功能。

双光标

版本 2 中添加了另一个附加光标,允许用户计算 2 个点之间的差异。引入了新的数据类 `ChartCursor` 来保存两个光标的关联信息:`Cursor1` 和 `Cursor2`。

    public class ChartCursor : ICloneable
    {
        public double X { get; set; }
        public double Y { get; set; }
        public ChartArea ChartArea { get; set; } = null;
        public object Clone()
        {
            return new ChartCursor() { X = this.X, Y = this.Y, ChartArea = this.ChartArea };
        }
    }

两个光标的对象可以通过以下扩展方法访问:

   public static ChartCursor Cursor1(this Chart sender);
   public static ChartCursor Cursor2(this Chart sender);
   public static PointF CursorsDiff(this Chart sender);

每个光标的外观:`Color`、`Width` 和 `DashStyle` 都可以在 `ChartOption` 中配置,这是一个传递给扩展类的变量,如上所述在 `EnableZoomAndPanControls` 中。

为了支持双光标,之前使用 MSChart 内部用户界面实现的图表光标方法已被放弃,取而代之的是使用 `Annotations` 实现的光标。因此,清除与图表关联的注释也将移除这两个光标。

鼠标滚轮操作

从版本 2.0.0 开始,鼠标滚轮操作已添加,如下所述:

  • 滚轮滚动:水平滚动缩放后的图表,向上滚动 = 向右滚动,向下滚动 = 向左滚动。
  • Shift + 滚轮滚动:垂直滚动缩放后的图表,向上滚动 = 向上滚动,向下滚动 = 向下滚动。
  • Ctrl + 滚轮滚动:放大/缩小图表。

鼠标滚轮事件在 MSChartExtension 类中的以下方法中处理:

    private static void ChartControl_MouseWheel(object sender, MouseEventArgs e);

缩放功能

除了从版本 1 沿用下来的“缩放窗口”、“缩放 X 轴”和“缩小”之外,版本 2 中还引入了“缩放 Y 轴”和“缩放对话框”。

  • 缩小:重置缩放并显示整个图表。
  • 缩放窗口:通过用鼠标在图表上绘制矩形来放大图表。
  • 缩放 X 轴:沿 X 轴缩放而不改变 Y 轴
  • 缩放 Y 轴(V2.0 中新增):沿 Y 轴缩放而不改变 X 轴。
  • 缩放对话框(V2.0 中新增):允许用户通过对话框手动输入每个 X 轴和 Y 轴的 `MIN` 和 `MAX` 值。

启用/禁用系列

在支持多个图表区域的情况下,在任何图表区域的上下文菜单(鼠标右键单击)中,只会显示分配给相应图表区域的系列。此选项可在 `ChartOption.ContextMenuAllowToHideSeries` 中启用/禁用。将此标志设置为 false 将禁用用户交互式显示/隐藏系列。

重构图表范围

返回整个图表区域 `GetBoundariesOfData` 和可见图表区域 `GetBoundariesOfVisibleData` 的方法已被名为 `GetChartAreaBoundary` 和 `GetChartVisibleAreaBoundary` 的新方法取代,并进行了重构实现。

        public static RectangleF GetChartAreaBoundary(this ChartArea sender, bool primaryAxis = true);
        public static RectangleF GetChartVisibleAreaBoundary(this ChartArea sender, bool primaryAxis = true);

这两个方法返回基于 X 和 Y 轴值的 4 个点坐标,代表图表区域。

代码使用 - 程序员参考

  • 在 Visual Studio 的 NuGet 包管理器中安装最新包。这样,您将在包发布时收到通知。
  • 配置图表区域和系列。
  • 执行 `EnableZoomAndPanControls` 来启用扩展功能。
  • 建议在添加/删除 `ChartArea` 或 `Series` 之前禁用 `DisableZoomAndPanControls`。

工具使用 - 用户手册

对于最终用户,大多数功能都可以通过图表上下文菜单(鼠标右键单击)访问,方法是将鼠标指针悬停在所需的图表区域上。关于鼠标滚轮控制相关功能的快速参考在“关于”对话框中描述,如下所示:

其他配置/设置,例如图表光标的外观,可能取决于开发人员是否将其公开。

致谢

历史

  • 2016/08/17:MSChart 扩展(版本 2.0.1)发布。
© . All rights reserved.