Form.Move和Form.LocationChanged有什么区别?

时间:2018-07-14 21:40:18

标签: c# winforms events

如果创建标准的C#WinForms应用程序,则会发现表单包含两个事件:MoveLocationChanged

Move会在表单移动时引发,而LocationChanged会在表单location属性更改时引发。

当然,如果表单移动了,location属性也会改变吗?

这两个事件之间有什么区别?在哪种情况下会开火而不是另一种?

2 个答案:

答案 0 :(得分:1)

MoveLocationChanged事件是相互关联的。我相信,任何一种都不会被解雇,而另一种则不会。不同之处在于它们属于不同类别的事件。

Move事件具有[SRCategoryAttribute("CatLayout")]属性。

LocationChanged事件具有[SRCategoryAttribute("CatPropertyChanged")]属性。

答案 1 :(得分:1)

MoveLocationChanged事件在Control类上声明,然后由ScrollableControlContainerControl和最后Form继承。

根据source codeOnLocationChanged调用OnMove 之前 ,它将调用LocationChanged事件处理程序。因此,OnMove事件将首先引发,然后然后 LocationChanged引发。从理论上讲,您可以知道Move将首先发生,从而处理这两个事件。

如果您仔细查看源代码,您会发现LocationChanged在边界更改(或类似事件)时升高。您还会注意到,唯一真正调用OnMove的东西实际上是OnLocationChanged

根据MSDNLocationChanged事件:

  

在位置属性值更改时发生。...此事件是   如果通过编程方式更改位置属性,则引发   修改或通过交互。

它以OnMove的形式no such distinction,只是声明:

  

在控件移动时发生。

这很奇怪,因为两个事件是相互关联的。

但是,这是一个特定的类处理这些事件的方式。我在参考源中进行了一些搜索,除了我已经引用的实例外,找不到任何显式调用Control的东西(从OnMove继承)。这并不意味着它们不存在,或者不能在他们自己的Control子类中单独调用它。