Позиционирование этикетки серии MS Chart Control - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть диаграмма Ганта (RangeBar), которую я сделал с помощью элемента управления MS Chart;для некоторых более коротких серий метка отображается за пределами панели;Я бы предпочел установить его так, чтобы метка оставалась внутри бара и была усечена (с многоточием было бы неплохо).Есть ли способ сделать это?Я искал свойства диаграммы и серии целую вечность, но безуспешно.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Я думаю, что вам нужно установить свойство BarLabelStyle

например.

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

См. Эту страницу Dundas , которая объясняет это пользовательское свойство, которое должно бытьаналогично или аналогично для элемента управления MS Chart.

0 голосов
/ 02 февраля 2015

В конце концов я свернул свой собственный, используя это (да, это грязно, он приберется, когда у меня будет время):

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, оно не отображает всплывающие подсказки)

...