为什么MS图表的矩形注释宽度是百分比而不是像msdn这样的像素呢? https://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.annotation.width(v=vs.110).aspx
这就是msdn所说的 获取或设置注释的宽度(以像素为单位)。
我想将宽度设置为像它所说的像素。我在这里错过了什么吗?
答案 0 :(得分:1)
恭喜,您在文档中发现了一个错误!只需点击Annotation.Height文档的链接即可轻松识别..
Annotation
的维度与Chart
控件中的其他维度一样确实以百分比给出。这样做的好处是,它们与Chart
控件一样非常巧妙地增长和缩小,就像许多其他元素一样。
因此,如果您将图表的宽度加倍,则基本上会使显示的DataPoints
的空间加倍,如果您的Annotation
超过了宽度的1/3,那么在您之后仍然会这样做已经调整了图表的大小..
哪个好。
但不是你想要的......
因此,要将大小设置为固定大小(以像素为单位),您需要执行此操作:
真正的问题是计算:如果你看Chart.ClientSize
得到像素的大小并获得n个像素,你需要做这样的事情:
float WidthInPercent = 100f * n / Chart.ClientSize.width;
然而,这并没有考虑到Chart
可能包含的各种元素:Size
的{{1}} 不真的计算为图表大小的直接百分比。
相反,它被计算为Annotation
的{{1}}的百分比。
InnerPlotPosition
设置为ChartArea CA
,因此可以访问其值,例如InnerPlotPosition
将返回Auto
;但是可以通过这样做来获得(当前!!)值:
CA.InnerPlotPosition.Width
同样适用于0f
本身的RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
:
Size/Position
现在,您可以将这些百分比与(当前!)ChartArea
结合起来,找出达到某个像素大小所需的百分比。
请注意,这些值会在调整大小时更改,因为外部附加内容(例如RectangleF CAP = CA.Position.ToRectangleF();
和Chart.ClientSize
以及Legend
等不会调整大小,因此他们的亲戚尺寸将相对于其包含元素而增长或眨眼。
所以你需要在每个Axis
事件中重新计算,或者更好:写一个函数来为你做这个你可以调用的函数。
结果是Labels
无论你如何调整Resize
的大小,都会(很大程度上,由于四舍五入)保持其大小。
以下是一些有用的功能:
这个以像素为单位返回Annotation
的当前 Chart
ClientRectangle
这个类似,并以像素为单位返回ChartArea
的当前RectangleF ChartAreaClientRectangle(Chart chart, ChartArea CA)
{
RectangleF CAR = CA.Position.ToRectangleF();
float pw = chart.ClientSize.Width / 100f;
float ph = chart.ClientSize.Height / 100f;
return new RectangleF(pw * CAR.X, ph * CAR.Y, pw * CAR.Width, ph * CAR.Height);
}
:
ClientRectangle
最后一个将像素大小转换为百分比的大小,再次仅在当前有效,即直到下一次大小或布局发生变化..:
ChartArea's InnerplotPosition
让我们看一下调整大小之前和之后的结果:
正如您所看到的,尺寸保持不变。
另请注意我在RectangleF InnerPlotPositionClientRectangle(Chart chart, ChartArea CA)
{
RectangleF IPP = CA.InnerPlotPosition.ToRectangleF();
RectangleF CArp = ChartAreaClientRectangle(chart, CA);
float pw = CArp.Width / 100f;
float ph = CArp.Height / 100f;
return new RectangleF(CArp.X + pw * IPP.X, CArp.Y + ph * IPP.Y,
pw * IPP.Width, ph * IPP.Height);
}
事件中绘制的彩色矩形,以说明新功能!
以下是SizeF Pixels2Percent( ChartArea CA, int w, int h)
{
RectangleF IPPR = InnerPlotPositionClientRectangle(chart1, CA);
float pw = 100f * w / IPPR.Width ;
float ph = 100f * h / IPPR.Height ;
return new SizeF(pw, ph);
}
事件:
Paint
以下是Paint
事件:
private void chart1_Paint(object sender, PaintEventArgs e)
{
ChartArea CA = chart1.ChartAreas[0];
e.Graphics.DrawRectangle(Pens.Violet,
Rectangle.Round(ChartAreaClientRectangle(chart1, CA)));
e.Graphics.DrawRectangle(Pens.LimeGreen,
Rectangle.Round(InnerPlotPositionClientRectangle(chart1, CA)));
}
这里有尺寸调整功能:
Resize
答案 1 :(得分:0)
是的,我们无法在%或px中设置它,因为属性值设置为double。 其次,pixle = H乘以W.但你只是设置图表的宽度然后你怎么能用pixle设置它?从根本上说,这是不可能的。我希望你能明白我的意思。
答案 2 :(得分:0)
我知道OP希望以像素为单位设置宽度,但是如果某些人(像我一样)既不想以像素也不能以%设置宽度,而是根据实际值设置即可:
annotation.IsSizeAlwaysRelative = False
annotation.Width = whatEverValue