Расположение этикеток серии MS Chart Control

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


person Jez Clark    schedule 06.04.2011    source источник


Ответы (2)


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

eg.

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

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

person LordHits    schedule 14.04.2011
comment
Извините, для меня это ничего не меняет :| - person Jez Clark; 16.04.2011
comment
Я подтверждаю, что это показывает метку внутри полосы по центру в MSChart. - person peterincumbria; 15.03.2014

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

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

person Jez Clark    schedule 02.02.2015