有很多本文档没有描述的但是可以执行的操作。每一个图表控件的用户都有自己不同的功能和特性的要求。一种能够适应多种功能需求的做法是提供一系列的能够创建控件中不存在的功能的工具。
在 C1Chart 中,有一系列的内置工具集,例如转换方法和诸如旋转,缩放,缩放图表等交互式的内置工具,这些工具能帮助我们进行定制并且更深一步的开发应用程序。
以下的章节描述了如何使用不同类型的坐标转换方法和内置工具集来进行运行时交互。
坐标转换方法
诸如 MouseMove 等的.Net 事件记录了图表区域的坐标值并提供了像素坐标,它在某个层上非常有用,但是它不会描述任何关于底层数据坐标,数据点,或者图表区域的任何信息。
图表的转换方法处理当终端用户的光标通过了图表并执行了某种操作的场景。
C1Chart 的坐标转换方法从像素坐标中提取了上述的信息。一旦你知道了像素坐标,你就可以调用任何下表所示的任何 C1Chart 中的坐标转换方法。来获取特定序列,数据坐标,数据索引的数据值。
像素到数据坐标转换方法 | 描述 |
SeriesFromCoord | 获取离特定工作区坐标最近的图例项的组和系列指数。鼠标坐标在工作区坐标中指定。 |
CoordToDataCoord | 计算代码所指定的图表工作区坐标内的一个点的数据坐标。 |
CoordToDataIndex | 返回序列,点指数,到组指定的工作区坐标最近的数据点的距离。 |
如果你知道数据坐标或者数据指数,但是不知道像素坐标,你可以使用下述的方法来将数据坐标或者数据指数转换为像素坐标。
数据到像素坐标转换方法 | 描述 | ||
DataIndexToCoord | 计算代码所指定的数据坐标内的一个点的工作区坐 | ||
|
| 标。 |
|
| DataCoordToCoord | 返回指定数据点的工作区坐标 |
|
当和.Net 的 MouseMove 事件一起使用时,这些工具能够创建有趣的应用程序—处理双击图例和图表提示的特性。.Net 中的 MouseMove 事件提供了用户的光标,当光标拖到图表上并且不断地更新用户光标所在位置的数据。
本文当的下面几个章节简要地描述了如何使用每一种的坐标转换方法,并且为每一种方法提
供了示例。
转换坐标到序列
C1Chart 图例中,序列使用序列名称和一个含有 SymbolStyle 或者 LineStyle 的样式的符号来代表。 图例的 SeriesFromCoord 方法返回到图例中的一个像素坐标值的最近的关联序列。例如,假设用户在图例上点击第一个序列的符号,此刻将用户鼠标的像素坐标作为参数传入
SeriesFromCoord 方法,将会从 Group 和 Series 两个 ref 参数中得到组和序列的值。以下是前述的示例:
- Visual Basic
Dim LegendGroup As Integer
Dim LegendSeries As Integer
C1Chart1.Legend.SeriesFromCoord(170, 275, LegendGroup, LegendSeries)
- C#
int LegendGroup = 0; int LegendSeries = 0;
c1Chart1.Legend.SeriesFromCoord(170, 275, ref LegendGroup, ref LegendSeries);
转换像素坐标到数据点和反向操作。
C1Chart 同样允许将像素坐标转化成它们关联的数据坐标或者数据索引,反向操作也是支持的。进行这些操作的方法有 CoordToDataCoord 方法,CoordToDataIndex 方法, DataCoordToCoord 方法和 DataIndexToCoord 方法。下图展示了在 C1Chart 中那些区域是使用像素坐标控制,那些区域是使用数据坐标控制(代码)
转换像素坐标成数据点
ChartGroup 对象的 CoordToDataCoord 和 CoordToDataIndex 两个方法用来把像素坐标转换成数据坐标或者数据点。这两个方法都有一个很可能来自于 MouseMove 事件的坐标值作为参数,然后返回代码坐标或者最近的数据点。
CoordToDataCoord 方法
CoordToDataCoord 方法有四个参数,前两个参数(示例程序中的 e.X 和 e.Y)是从
MouseMove事件中拿到的像素坐标。后两个整数型参数是方法用来填充X和Y数据坐标的数据。
下面的示例程序时在 MouseMove 事件中使用该方法的例子。
- Visual Basic
Dim CoordXOutput As Double
Dim CoordYOutput As Double
C1Chart1.ChartGroups.Group0.CoordToDataCoord(e.X, e.Y, CoordXOutput, CoordYOutput)
Debug.WriteLine("X Data Coordinate: " & CoordXOutput.ToString())
Debug.WriteLine("Y Data Coordinate: " & CoordYOutput.ToString())
C#
double CoordXOutput = 0; double CoordYOutput = 0;
c1Chart1.ChartGroups.Group0.CoordToDataCoord(e.X, e.Y, CoordXOutput, CoordYOutput); c1Chart1.ChartGroups.Group0.
CoordToDataCoord(e.X, e.Y, ref CoordXOutput, ref CoordYOutput);
ConsoleDebug.Writeline("X Data Coordinate: " + CoordXOutput.ToString());
ConsoleDebug.Writeline("Y Data Coordinate: " + CoordYOutput.ToString());
CoordToDataIndex 方法
CoordToDataIndex 方法有六个参数,前两个参数(示例程序中的 e.X 和 e.Y)是从
MouseMove 事件中拿到的像素坐标。第三个参数是一个 CoordinateFocusEnum 枚举值。这个枚举指定了当要决定哪个点更近一些和到像素坐标的距离的时候以哪个轴线为焦点。例如,如果选择以 X 为焦点,那么会返回相对于 X 的最近点,而无视相对于 Y 的值。第四和第五两个整数型参数是方法用来填充对应的数据坐标的数据。第六个整数型参数是方法用来填充从指定的像素坐标到数据点的以像素为单位的距离值。下面的示例程序时在 MouseMove 事件中使用该方法的
例子。Visual Basic
Dim SeriesOutput As Integer
Dim PointOutput As Integer
Dim DistanceOutput As Integer
C1Chart1.ChartGroups.Group0._
CoordToDataIndex(e.X, e.Y, CoordinateFocusEnum.XandYCoord,_ ref SeriesOutput, ref
PointOutput, ref DistanceOutput)
Debug.WriteLine("Series Index: " & SeriesOutput.ToString())
Debug.WriteLine("Point Index: " & PointOutput.ToString())
Debug.WriteLine("Distance From Point: " & DistanceOutput.ToString())C#
int SeriesOutput = 0; int PointOutput = 0; int DistanceOutput = 0;
c1Chart1.ChartGroups.Group0.CoordToDataIndex(e.X, e.Y, CoordinateFocusEnum.XandYCoord,
ref SeriesOutput, ref PointOutput, ref DistanceOutput);
ConsoleDebug.Writeline("Series Index: " + SeriesOutput.ToString());
ConsoleDebug.Writeline("Point Index: " + PointOutput.ToString());
ConsoleDebug.Writeline("Distance From Point: " + DistanceOutput.ToString());转换数据点到像素坐标
ChartGroup 对象的 DataIndexToCoord 和 DataCoordToCoord 方法的作用是转换数据坐标或者数据索引到像素坐标。DataIndexToCoord 方法以一个序列和点索引为参数并且返回指定数据点的工作区坐标。 DataCoordToCoord 方法以一个数据坐标集为参数并返回一个像素坐标。
这两个方法与其它的转换方法非常相似。
DataIndexToCoord 方法
DataIndexToCoord 方法有四个参数。并且返回一个像素坐标。请看下面的例子:- Visual Basic
Dim CoordX, CoordY As Integer C1Chart1.ChartGroups.Group0.
DataIndexToCoord(ChartSeries, ChartPoint, CoordX, CoordY)
Debug.WriteLine("X Chart Coordinate: " & CoordX.ToString())
Debug.WriteLine("Y Chart Coordinate: " & CoordY.ToString())
C#
int CoordX=0, CoordY=0; c1Chart1.ChartGroups.Group0.
DataIndexToCoord(ChartSeries, ChartPoint, ref CoordX, ref CoordY);
Debug.Writeline("X Chart Coordinate: " + CoordX.ToString());
Debug.Writeline("Y Chart Coordinate: " + CoordY.ToString());DataCoordToCoord 方法
DataCoordToCoord 方法有四个参数。并且返回一个像素坐标。请看下面的例子:- Visual Basic
Dim CoordX, CoordY As Integer
C1Chart1.ChartGroups.Group0._
DataCoordToCoord(DataCordX, DataCoordY, CoordX, CoordY)
Debug.WriteLine("X Chart Coordinate: " & CoordX.ToString())
Debug.WriteLine("Y Chart Coordinate: " & CoordY.ToString())
C#
int CoordX=0, CoordY=0; c1Chart1.ChartGroups.Group0.
DataCoordToCoord(DataCordX, DataCoordY, ref CoordX, ref CoordY);
ConsoleDebug.Writeline("X Chart Coordinate: " + CoordX.ToString());
ConsoleDebug.Writeline("Y Chart Coordinate: " + CoordY.ToString());旋转,缩放(Scale ),平移和缩放(Zoom)
C1Chart 含有一些能够让与终端用户的交互变得更容易实现的内置工具。终端用户可以结合鼠标和 Shift 按键来对图表进行浏览,旋转和缩放操作。除了提供给终端用户的内置工具外,在
C1Chart 里对于终端用户来说修改任何诸如轴标签等的图表元素也是可行的。可以通过设置
C1Chart 对象的 Microsoft 属性格或者使用 ShowProperties 方法来实现上述功能。终端用户交互
C1Chart 含有一些能够让与终端用户的交互变得更容易实现的内置工具。终端用户可以结合鼠标和 Shift 按键来对图表进行浏览,旋转和缩放操作。
C1Chart 里的用户交互特性的控制中心是 Interaction 对象。 Interaction 对象含有很多能够自定义界面的属性。所有这些属性都可以在设计时通过属性窗口或者 Action Collection Editor
来进行设置和修改,或者在代码中使用 Interaction 类来进行设置和修改动作。
Interaction 类含有以下的属性:- IsDefault 是一个用来指示动作设定是否是默认的布尔类型属性。如果要恢复默认,将 IsDefault 属性设置为 True。
- Enabled 属性用来开启/关闭交互。请注意默认交互是禁用的。
- Actions 包含一系列图表可用的动作。
- 下面展示了所有支持的动作:
- 旋转动作可以改变视角,这个动作仅当图表有 3D 效果时才可用。
- 缩放(Scale)动作根据选中的横坐标或者纵坐标来增加或者减少图表的尺寸。
- 平移动作提供了在绘制区域内滚动的机会。
- 缩放(Zoom)动作允许用户选中矩形区域来查看。
- 缩放(Scale),平移,缩放(Zoom)仅对笛卡尔坐标轴的图表才可用。
- 每一个动作对象都提供了一系列进行动作的自定义行为的属性:
- Name 属性获取动作的名称。
- Axis 属性指定动作涉及的轴线。可能对一个动作只使用一个轴线。例如,缩放
(Scale)或者平移可以被应用在横向(x-轴)或者纵向(y-轴)方向。
- MouseButton 和 Modifier 属性指定可以出发动作执行的鼠标按钮和按键(Alt,
Control 或者 Shift)的组合。
控制转换
应用到图表上的转换都可以通过 C1Chart 的 Transform 事件来监听到。当缩放(Scale),平移,缩放(Zoom)发生时, Transform 时间被触发。对该事件进行处理可以限制轴线的边界,或者取消动作。
下面的示例通过当轴线超出最大或者最小范围时取消动作来限制 x-轴线的边界为从-10 到
10。
Visual Basic
Private Sub C1Chart1_Transform(ByVal sender As Object, _ ByVal e As C1.Win.C1Chart.TransformEventArgs) Handles C1Chart1.Transform If e.MinX < -10 Or e.MaxX > 10 Then e.Cancel = True
End If
End Sub- C#
private void c1Chart1_Transform(object sender,C1.Win.C1Chart.TransformEventArgs e) |
创建一个缩放(Zoom)效果
通过简单地调整轴线,可以为图表创建一个缩放(Zoom)的效果。例如,你可以在你的应用程序中添加两个按钮(Zoom in 和 Zoom out 按钮)来在运行时根据按钮的点击来调整你的轴线。
这里是一份演示了如何处理 Button_Click 事件来控制缩放(Zoom)的代码。
Visual Basic
' Controls zooming in
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Dim xMin As Double = Me.C1Chart1.ChartArea.AxisX.Min
Dim xMax As Double = Me.C1Chart1.ChartArea.AxisX.Max
Dim xChange As Double = (xMax - xMin) * 0.05
Me.C1Chart1.ChartArea.AxisX.Min = xMin + xChange
Me.C1Chart1.ChartArea.AxisX.Max = xMax - xChange
Dim yMin As Double = Me.C1Chart1.ChartArea.AxisY.Min()
Dim yMax As Double = Me.C1Chart1.ChartArea.AxisY.Max
Dim yChange As Double = (yMax - yMin) * 0.05
Me.C1Chart1.ChartArea.AxisY.Min = yMin + yChange
Me.C1Chart1.ChartArea.AxisY.Max = yMax - yChange
End Sub
' Controls zooming out
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
Dim xMin As Double = Me.C1Chart1.ChartArea.AxisX.Min
Dim xMax As Double = Me.C1Chart1.ChartArea.AxisX.Max
Dim xChange As Double = (xMax - xMin) * 0.05
Me.C1Chart1.ChartArea.AxisX.Min = xMin - xChange
Me.C1Chart1.ChartArea.AxisX.Max = xMax + xChange
Dim yMin As Double = Me.C1Chart1.ChartArea.AxisY.Min()
Dim yMax As Double = Me.C1Chart1.ChartArea.AxisY.Max
Dim yChange As Double = (yMax - yMin) * 0.05
Me.C1Chart1.ChartArea.AxisY.Min = yMin - yChange
Me.C1Chart1.ChartArea.AxisY.Max = yMax + yChange
End SubC#
// Controls zooming in private void button1_Click(object sender, System.EventArgs e)
{
double xMin = this.c1Chart1.ChartArea.AxisX.Min; double xMax = this.c1Chart1.ChartArea.AxisX.Max; double xChange = (xMax - xMin) * 0.05; this.c1Chart1.ChartArea.AxisX.Min = xMin + xChange; this.c1Chart1.ChartArea.AxisX.Max = xMax - xChange; double yMin = this.C1Chart1.ChartArea.AxisY.Min(); double yMax = this.C1Chart1.ChartArea.AxisY.Max; double yChange = (yMax - yMin) * 0.05; this.c1Chart1.ChartArea.AxisY.Min = yMin + yChange; this.c1Chart1.ChartArea.AxisY.Max = yMax - yChange;
}
// Controls zooming out private void button2_Click(object sender, System.EventArgs e)
{
double xMin = this.c1Chart1.ChartArea.AxisX.Min; double xMax = this.c1Chart1.ChartArea.AxisX.Max; double xChange = (xMax - xMin) * 0.05; this.c1Chart1.ChartArea.AxisX.Min = xMin - xChange; this.c1Chart1.ChartArea.AxisX.Max = xMax + xChange; double yMin = this.c1Chart1.ChartArea.AxisY.Min(); double yMax = this.c1Chart1.ChartArea.AxisY.Max; double yChange = (yMax - yMin) * 0.05;
this.c1Chart1.ChartArea.AxisY.Min = yMin - yChange; this.c1Chart1.ChartArea.AxisY.Max = yMax + yChange;
}用多 Y-轴线来缩放(Zoom),平移和缩放(Scale)
为了在诸如缩放(Zoom),平移和缩放(Scale)等的交互特性中使用第二个 y-轴线,必须设置
对应的 Axis 属性。例如:- Visual Basic
C1Chart1.Interaction.Actions("Zoom").Axis = AxisFlagEnum.AxesAll
- C#
c1Chart1.Interaction.Actions["Zoom"].Axis = AxisFlagEnum.AxesAll;