MS图表控制系列标签定位

本文关键字:标签 定位 系列 控制 MS | 更新日期: 2023-09-27 17:49:29

我用MS chart控件制作了一个甘特图(RangeBar);对于一些较短的系列,标签显示在栏外;我更喜欢设置它,这样标签就会留在栏内并被截断(使用省略号会很好)。有办法做到这一点吗?我已经在图表和系列的属性中摸索了很长时间了,但是没有成功。

MS图表控制系列标签定位

我认为你需要设置的属性是BarLabelStyle

chart.Series["mySeries"]["BarLabelStyle"] = "Center";

请参阅此Dundas页面,该页面解释了应该与MS Chart控件相似或相同的自定义属性。

最后,我用这个卷了我自己的(是的,它很乱,当我有时间的时候会整理的):

private static void Chart_PostPaint(object sender, ChartPaintEventArgs e)
    {
        Chart c = ((Chart)sender);
        foreach (Series s in c.Series)
        {
            string sVt = s.GetCustomProperty("PixelPointWidth");
            IGanttable ig = (IGanttable)s.Tag;
            double dblPixelWidth = c.ChartAreas[0].AxisY.ValueToPixelPosition(s.Points[0].YValues[1]) - c.ChartAreas[0].AxisY.ValueToPixelPosition(s.Points[0].YValues[0]);
            s.Label = ig.Text.AutoEllipsis(s.Font, Convert.ToInt32(dblPixelWidth)-dblSeriesPaddingGuess);
        }
    }

public static string AutoEllipsis(this String s, Font f, int intPixelWidth)
    {
        if (s.Length == 0 || intPixelWidth == 0) return "";

        var result = Regex.Split(s, "'r'n|'r|'n");
        List<string> l = new List<string>();
        foreach(string str in result)
        {
            int vt = TextRenderer.MeasureText(str, f).Width;
            if (vt < intPixelWidth)
            { l.Add(str); }
            else
            {
                string strTemp = str;
                int i = str.Length;
                while (TextRenderer.MeasureText(strTemp + "…", f).Width > intPixelWidth)
                {
                    strTemp = str.Substring(0, --i);
                    if (i == 0) break;
                }
                l.Add(strTemp + "…");
            }
        }
        return String.Join("'r'n", l);
    }

这似乎工作得很愉快,只要它是Post_Paint事件(如果你使用Paint事件,它会阻止工具提示显示)