MS图表矩形注释宽度(以百分比表示)而不是像素

时间:2016-04-08 03:53:16

标签: c# vb.net annotations mschart

为什么MS图表的矩形注释宽度是百分比而不是像msdn这样的像素呢? https://msdn.microsoft.com/en-us/library/system.windows.forms.datavisualization.charting.annotation.width(v=vs.110).aspx

这就是msdn所说的 获取或设置注释的宽度(以像素为单位)。

我想将宽度设置为像它所说的像素。我在这里错过了什么吗?

3 个答案:

答案 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

让我们看一下调整大小之前和之后的结果:

enter image description here enter image description here

正如您所看到的,尺寸保持不变。

另请注意我在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