我有一个用 MS Chart 控件制作的甘特图(RangeBar);对于一些较短的系列,标签显示在栏外;我更喜欢设置它,以便标签留在栏内并被截断(省略号会很好)。有没有办法做到这一点?多年来,我一直在研究图表和系列的属性,但没有成功。
问问题
7539 次
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
事件,它将停止显示工具提示)
于 2015-02-02T17:31:24.217 回答