我知道可以通过操纵Control.Top
和Control.Height
来对齐控件的底部。同样Control.Right
。但是为什么.NET决定不直接修改这些属性呢?自从我最近几次采访控制定位以来,它一直令人沮丧。
答案 0 :(得分:5)
我认为他们已将Bottom
和Right
设为只读,不是因为它在技术上是必要的,而是作为一种记录这些属性的方式在Top
/ Height
或Left
/ Width
被修改时重新计算。
有两个属性集:一个用于绝对坐标(Top
,Bottom
,Left
,Right
),另一个用于维度(Height
, Width
)。它们之间的关系由以下两个不变量定义:
Width == Right - Left
Height == Bottom - Top
现在,例如,如果Microsoft决定Top
属性应该是可写的,那么他们需要做出一个进一步的设计决策:Top
中的更改...
Height
并保留Bottom
或Height
并影响Bottom
?除非他们引入某种允许用户选择的进一步“锚”属性,否则Microsoft 必须决定其中一种后果以保证上面的不变(2)。
显然他们决定采用后两种方案。接下来,微软需要记录他们的决定。他们可以提到在他们的MSDN参考页面上调整Top
的后果......事实证明他们就是这样做了:
对
Height
和Top
属性值所做的更改会导致控件的Bottom
属性值发生变化。 - Remarks section of the MSDN reference page for theControl.Top
property
...或者他们可以将Bottom
属性声明为只读,向我们的程序员建议此属性取决于其他两个属性(Top
和Height
)...他们也完成了:
的值来操纵此属性值
Bottom
属性是只读属性。您可以通过更改Top
或Height
属性[...] - Remarks section of the MSDN reference page for theControl.Bottom
property
因此,他们用英语和其他方式记录了他们(任意)的设计决策。
答案 1 :(得分:3)
引用Eric Lippert的话: “ 你继续问“为什么?”问题,我觉得很难回答,因为你的问题是秘密的“为什么不呢?”题。也就是说,你真正要问的问题是“我有一个关于[特征]显然应该如何设计的概念;为什么它不是那样的?” “
答案“为什么不呢?”问题可能在:
之间答案 2 :(得分:2)
自计算Bottom
和Right
以来,操作例如像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)
由于Right
由Left+Width
确定,Bottom
由Top+Height
确定。
您可以使用Left
,Top
,Width
和Height
来有效地定位控件。
理论上可以设置属性,但我猜他们认为可能会导致太多问题。
由于底层架构不支持Right
和Bottom
,因此只需将它们设为计算属性就太方便了。
答案 5 :(得分:0)
如果您想更改Control
的尺寸或位置,可以更改Control.Location和Control.Size属性。我相信Control.Bottom
和Control.Right
属性是根据这些其他属性计算的。