如果创建标准的C#WinForms应用程序,则会发现表单包含两个事件:Move
和LocationChanged
。
Move
会在表单移动时引发,而LocationChanged
会在表单location
属性更改时引发。
当然,如果表单移动了,location属性也会改变吗?
这两个事件之间有什么区别?在哪种情况下会开火而不是另一种?
答案 0 :(得分:1)
Move
和LocationChanged
事件是相互关联的。我相信,任何一种都不会被解雇,而另一种则不会。不同之处在于它们属于不同类别的事件。
Move
事件具有[SRCategoryAttribute("CatLayout")]
属性。
LocationChanged
事件具有[SRCategoryAttribute("CatPropertyChanged")]
属性。
答案 1 :(得分:1)
Move
和LocationChanged
事件在Control
类上声明,然后由ScrollableControl
,ContainerControl
和最后Form
继承。
根据source code,OnLocationChanged
调用OnMove
之前 ,它将调用LocationChanged
事件处理程序。因此,OnMove
事件将首先引发,然后然后 LocationChanged
引发。从理论上讲,您可以知道Move
将首先发生,从而处理这两个事件。
如果您仔细查看源代码,您会发现LocationChanged
在边界更改(或类似事件)时升高。您还会注意到,唯一真正调用OnMove
的东西实际上是OnLocationChanged
。
根据MSDN,LocationChanged
事件:
在位置属性值更改时发生。...此事件是 如果通过编程方式更改位置属性,则引发 修改或通过交互。
它以OnMove
的形式no such distinction,只是声明:
在控件移动时发生。
这很奇怪,因为两个事件是相互关联的。
但是,这是一个特定的类处理这些事件的方式。我在参考源中进行了一些搜索,除了我已经引用的实例外,找不到任何显式调用Control
的东西(从OnMove
继承)。这并不意味着它们不存在,或者不能在他们自己的Control
子类中单独调用它。