0

MS Chart コントロールで作成したガント チャート (RangeBar) があります。一部の短いシリーズでは、ラベルがバーの外側に表示されます。ラベルがバーの内側にとどまり、切り捨てられるように設定することをお勧めします(省略記号を使用すると便利です)。これを行う方法はありますか?私は何年にもわたってチャートとシリーズのプロパティを探し回ってきましたが、成功していません。

4

2 に答える 2

3

設定する必要があるプロパティはBarLabelStyle

例えば。

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

このDundas ページを参照してください。これは、MS Chart コントロールに類似または同一である必要があるカスタム プロパティを説明しています。

于 2011-04-14T20:34:41.597 に答える
0

最後に、これを使用して自分でロールバックしました(はい、面倒です。時間があれば片付けます):

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と、ToolTip が表示されなくなります)。

于 2015-02-02T17:31:24.217 に答える