/// <summary> /// Create a TextLabel for each bar in the GraphPane. /// Call this method only after calling AxisChange() /// </summary> /// <remarks> /// This method will go through the bars, create a label that corresponds to the bar value, and place it on the graph depending on user preferences. This works for horizontal or vertical bars in clusters or stacks. /// </remarks> /// <param name="pane">The GraphPane in which to place the text labels.</param> /// <param name="isBarCenter">true to center the labels inside the bars, false to place the labels just above the top of the bar.</param> /// <param name="valueFormat">The double.ToString string format to use for creating the labels</param> private void CreateBarLabels(GraphPane pane, bool isBarCenter, string valueFormat) { bool isVertical = pane.BarSettings.Base == BarBase.X; // Make the gap between the bars and the labels = 3% of the axis range float labelOffset; if (isVertical) labelOffset = (float)(pane.YAxis.Scale.Max - pane.YAxis.Scale.Min) * 0.03f; else labelOffset = (float)(pane.XAxis.Scale.Max - pane.XAxis.Scale.Min) * 0.03f; // keep a count of the number of BarItems int curveIndex = 0; // Get a valuehandler to do some calculations for us ValueHandler valueHandler = new ValueHandler(pane, true); // Loop through each curve in the list foreach (CurveItem curve in pane.CurveList) { // work with BarItems only BarItem bar = curve as BarItem; if (bar != null) { IPointList points = curve.Points; // Loop through each point in the BarItem for (int i = 0; i < points.Count; i++) { // Get the high, low and base values for the current bar // note that this method will automatically calculate the "effective" values if the bar is stacked double baseVal, lowVal, hiVal; valueHandler.GetValues(curve, i, out baseVal, out lowVal, out hiVal); // Get the value that corresponds to the center of the bar base // This method figures out how the bars are positioned within a cluster float centerVal = (float)valueHandler.BarCenterValue(bar, bar.GetBarWidth(pane), i, baseVal, curveIndex); // Create a text label -- note that we have to go back to the original point // data for this, since hiVal and lowVal could be "effective" values from a bar stack string barLabelText = (isVertical ? points[i].Y : points[i].X).ToString(valueFormat); // Calculate the position of the label -- this is either the X or the Y coordinate depending on whether they are horizontal or vertical bars, respectively float position; if (isBarCenter) position = (float)(hiVal + lowVal) / 2.0f; else position = (float)hiVal + labelOffset; // Create the new TextObj TextObj label; if (isVertical) label = new TextObj(barLabelText, centerVal, position); else label = new TextObj(barLabelText, position, centerVal); // Configure the TextObj //label.Location.CoordinateFrame = CoordType.AxisXYScale; label.FontSpec.Size = 12; label.FontSpec.FontColor = Color.RosyBrown; //label.FontSpec.Angle = 0; label.Location.AlignH = AlignH.Center; //label.Location.AlignV = AlignV.Center; label.FontSpec.Border.IsVisible = false; label.FontSpec.Fill.IsVisible = false; // Add the TextObj to the GraphPane pane.GraphObjList.Add(label); } } curveIndex++; } } 代码出处:http://zedgraph.org/wiki/index.php?title=Horizontal_Bar_With_Labels_Demo_v4