Form.Move和Form.LocationChanged之间有什么区别



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

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

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

这两件事有什么不同?在哪种情况下,一个会着火,另一个不会?

MoveLocationChanged事件在Control类上声明,然后由ScrollableControlContainerControlForm继承。

根据源代码,OnLocationChanged在调用LocationChanged事件处理程序之前调用OnMove。因此,将首先引发OnMove事件,然后引发LocationChanged。理论上,您可以在知道Move将首先发生的情况下处理这两个事件。

如果你仔细查看源,你会发现当边界发生变化(或类似事件(时,LocationChanged会被引发。您还将注意到,唯一实际调用OnMove的东西实际上是OnLocationChanged

据MSDN报道,LocationChanged事件:

在Location属性值发生更改时发生。。。。本次活动如果Location属性由编程的修改或通过交互。

它对OnMove没有这样的区别,它只声明:

在移动控件时发生。

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

然而,这就是一个特定类处理这些事件的方式。我在引用源中进行了一些搜索,但除了我已经引用的实例之外,我找不到任何明确调用OnMove的内容(从Control继承(。这并不意味着它们不存在,也不意味着不能在Control的子类中单独调用它。

MoveLocationChanged事件都是互连的。我相信不存在一个被解雇而另一个没有被解雇的情况。不同之处在于它们属于不同的事件类别。

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

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

最新更新