Winforms 为什么';t ResizeBegin是否需要最大化的MDI子级?

Winforms 为什么';t ResizeBegin是否需要最大化的MDI子级?,winforms,mdichild,mdiparent,Winforms,Mdichild,Mdiparent,在Winforms中,如果MDI子窗口最大化,则不会接收ResizeBegin(或ResizeEnd)事件。它确实接收调整大小事件-为什么会有区别?如果未最大化子级,则它将获得ResizeBegin/End事件。有什么好办法吗?有很多难看的方法:例如,直接从MDI容器ResizeBegin事件调用子容器。当用户开始和停止调整窗口大小时,会生成ResizeBegin/End事件。通过窗口内部的模式循环实现,当用户移动窗口时,它会使窗口边缘跟随鼠标光标。单击窗口边缘时调整开始,释放鼠标按钮时调整结束

在Winforms中,如果MDI子窗口最大化,则不会接收ResizeBegin(或ResizeEnd)事件。它确实接收调整大小事件-为什么会有区别?如果未最大化子级,则它将获得ResizeBegin/End事件。有什么好办法吗?有很多难看的方法:例如,直接从MDI容器ResizeBegin事件调用子容器。

当用户开始和停止调整窗口大小时,会生成ResizeBegin/End事件。通过窗口内部的模式循环实现,当用户移动窗口时,它会使窗口边缘跟随鼠标光标。单击窗口边缘时调整开始,释放鼠标按钮时调整结束

在代码中更改MDI子窗口的Size或ClientSize属性时,显然没有用户参与。因此,没有开始或结束,只有调整大小事件。而且只有一个调整大小事件触发器,没有像用户使用鼠标调整大小时那样的恒定序列。这也解释了为什么开始/结束很重要,如果你在调整大小事件处理程序中做了很多工作,那么你的UI就会陷入困境。与自动布局一样,可见的工件并不漂亮


如果您真的必须这样做,那么您可以自己生成事件。在更改窗口的Client/Size属性值之前调用OnResizeBegin(),在更改窗口的Client/Size属性值之后调用OnResizeEnd()。该代码需要存在于您调整大小的窗口中,才能触发正确的事件。顺便说一句,您不太可能这样做。请注意,MDI会自动调整最大化MDI子窗口的大小,当您激活另一个窗口时,它当然不能再最大化。您不能使用OnResizeBegin/End()调用将其包装。

子项上的重画相当繁重,因此我在ResizeBegin上设置了一个标志,在resize中进行不太密集的重画,然后在ResizeEnd进行完全重画。确定。关注答案中的“和一个调整大小事件触发器”短语。从最大化的MDI子级获得多次重画是不可避免的,请关注最后一段。