如果您创建一个标准的C#WinForms应用程序,您会发现一个表单有两个事件:Move
和LocationChanged
。
Move
在表单移动时引发,LocationChanged
在表单location
属性更改时引发。
当然,如果表单移动,位置属性也会改变吗?
这两件事有什么不同?在哪种情况下,一个会着火,另一个不会?
Move
和LocationChanged
事件在Control
类上声明,然后由ScrollableControl
、ContainerControl
和Form
继承。
根据源代码,OnLocationChanged
在调用LocationChanged
事件处理程序之前调用OnMove
。因此,将首先引发OnMove
事件,然后引发LocationChanged
。理论上,您可以在知道Move
将首先发生的情况下处理这两个事件。
如果你仔细查看源,你会发现当边界发生变化(或类似事件(时,LocationChanged
会被引发。您还将注意到,唯一实际调用OnMove
的东西实际上是OnLocationChanged
。
据MSDN报道,LocationChanged
事件:
在Location属性值发生更改时发生。。。。本次活动如果Location属性由编程的修改或通过交互。
它对OnMove
没有这样的区别,它只声明:
在移动控件时发生。
这很奇怪,因为这两个事件是相互关联的。
然而,这就是一个特定类处理这些事件的方式。我在引用源中进行了一些搜索,但除了我已经引用的实例之外,我找不到任何明确调用OnMove
的内容(从Control
继承(。这并不意味着它们不存在,也不意味着不能在Control
的子类中单独调用它。
Move
和LocationChanged
事件都是互连的。我相信不存在一个被解雇而另一个没有被解雇的情况。不同之处在于它们属于不同的事件类别。
Move
事件具有[SRCategoryAttribute("CatLayout")]
属性。
LocationChanged
事件具有[SRCategoryAttribute("CatPropertyChanged")]
属性。