У меня есть диаграмма Ганта (RangeBar), которую я сделал с помощью элемента управления MS Chart; для некоторых более коротких серий метка отображается за пределами панели; Я бы предпочел установить его так, чтобы метка оставалась внутри полосы и усекалась (с многоточием было бы неплохо). Есть ли способ сделать это? Я уже целую вечность ковыряюсь в свойствах диаграммы и ряда, но безуспешно.
Расположение этикеток серии MS Chart Control
Ответы (2)
Я думаю, что вам нужно установить свойство BarLabelStyle
eg.
chart.Series["mySeries"]["BarLabelStyle"] = "Center";
См. эту страницу Dundas, на которой объясняется, что пользовательское свойство, которое должно быть похожим или одинаковым для Управление диаграммой MS.
person
LordHits
schedule
14.04.2011
Извините, для меня это ничего не меняет :|
- person Jez Clark; 16.04.2011
Я подтверждаю, что это показывает метку внутри полосы по центру в 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