MSChart 扩展版本 2
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`。
工具使用 - 用户手册
对于最终用户,大多数功能都可以通过图表上下文菜单(鼠标右键单击)访问,方法是将鼠标指针悬停在所需的图表区域上。关于鼠标滚轮控制相关功能的快速参考在“关于”对话框中描述,如下所示:
其他配置/设置,例如图表光标的外观,可能取决于开发人员是否将其公开。
致谢
- 感谢 Johm Metus 实现的菜单克隆功能,该功能已发布在 一个相当不错的菜单克隆器中。
- 感谢 Pat Kujawa 为此项目提供的想法和贡献。
历史
- 2016/08/17:MSChart 扩展(版本 2.0.1)发布。