为什么WinForms Control.Bottom和Control.Right只读?

时间:2012-07-06 11:50:48

标签: .net winforms controls

我知道可以通过操纵Control.TopControl.Height来对齐控件的底部。同样Control.Right。但是为什么.NET决定不直接修改这些属性呢?自从我最近几次采访控制定位以来,它一直令人沮丧。

6 个答案:

答案 0 :(得分:5)

简答:

我认为他们已将BottomRight设为只读,不是因为它在技术上是必要的,而是作为一种记录这些属性的方式在Top / HeightLeft / Width被修改时重新计算。

更长的答案:

有两个属性集:一个用于绝对坐标(TopBottomLeftRight),另一个用于维度(HeightWidth)。它们之间的关系由以下两个不变量定义:

  1. Width == Right - Left
  2. Height == Bottom - Top
  3. 现在,例如,如果Microsoft决定Top属性应该是可写的,那么他们需要做出一个进一步的设计决策:Top中的更改...

    • 影响Height并保留Bottom
    • 保留Height并影响Bottom

    除非他们引入某种允许用户选择的进一步“锚”属性,否则Microsoft 必须决定其中一种后果以保证上面的不变(2)。

    显然他们决定采用后两种方案。接下来,微软需要记录他们的决定。他们可以提到在他们的MSDN参考页面上调整Top的后果......事实证明他们就是这样做了:

      

    HeightTop属性值所做的更改会导致控件的Bottom属性值发生变化。 - Remarks section of the MSDN reference page for the Control.Top property

    ...或者他们可以将Bottom属性声明为只读,向我们的程序员建议此属性取决于其他两个属性(TopHeight)...他们完成了:

      

    Bottom属性是只读属性。您可以通过更改TopHeight属性[...] - Remarks section of the MSDN reference page for the Control.Bottom property

    的值来操纵此属性值

    因此,他们用英语和其他方式记录了他们(任意)的设计决策。

答案 1 :(得分:3)

引用Eric Lippert的话: “ 你继续问“为什么?”问题,我觉得很难回答,因为你的问题是秘密的“为什么不呢?”题。也就是说,你真正要问的问题是“我有一个关于[特征]显然应该如何设计的概念;为什么它不是那样的?” “

答案“为什么不呢?”问题可能在:

之间
  1. 此“功能”(可设置的Bottom和Right属性)不是 建议/不被认为有用
  2. 可设置权限的行为 和底部是不明确的 - 我是否重新调整相关控件的大小 (改变高度/宽度)或重新定位(改变顶部/右侧)。 不同的人会对“正确”有不同的看法 行为在这里。

答案 2 :(得分:2)

自计算BottomRight以来,操作例如像Bottom一样 Bottom = 100会转换为(Top + Height) = 100。这个动作是不明确的,你想改变控件的高度还是想重新定位它?

答案 3 :(得分:2)

因为坐标系基于左上方向。 (0,0)是屏幕的左上角,所有基于位置的测量都是相对于(0,0)。设置左上角坐标时,你的意思非常清楚:位置。然而,右下坐标更加模糊,因为它们还涉及高度和宽度(如前所述)。

如果您向Right属性添加5,会发生什么?位置会改变,还是宽度会改变?这不是一个有用或有意义的功能。

编辑:

  

如果左侧和顶部不涉及调整大小,那么为什么底部和右侧应该是?

因为坐标系是基于左上方向,而不是右下方。 GDI或您用于绘制控件的任何系统根据通用原点(0,0)和控件上相对于该原点的一个点计算位置。由于通用原点是屏幕的左上角,因此最有效的方法是使用控件的左上角作为定位点。

想象一下这两种情况:

场景1 - 控件不计算右下角坐标,它实际上存储了那些坐标。 GDI已准备好绘制控件。左上角坐标设置为(10,10),高度为10,宽度为10,右下角坐标为(25,25)。如何制定控制措施?

场景2 - 不是计算右下坐标,而是计算高度和宽度。左上角设置为(20,20),右下角设置为(10,10)。如何制定控制措施?

通过将程序员限制在左上角和高度/宽度,上述情况将永远不会发生,从而节省了处理时间和意外错误。

答案 4 :(得分:0)

由于RightLeft+Width确定,BottomTop+Height确定。

您可以使用LeftTopWidthHeight来有效地定位控件。

理论上可以设置属性,但我猜他们认为可能会导致太多问题。

由于底层架构不支持RightBottom,因此只需将它们设为计算属性就太方便了。

好吧,我承认,我猜。我没有明确的理由可以看到。您可能需要与.NET开发团队联系。

答案 5 :(得分:0)

如果您想更改Control的尺寸或位置,可以更改Control.LocationControl.Size属性。我相信Control.BottomControl.Right属性是根据这些其他属性计算的。