移动时保持表单大小,如果从另一个线程更改?

时间:2012-01-04 19:46:38

标签: winforms user-interface

通过实验我发现执行Move时会触发Resize事件。不仅如此,Move动作还保留了调整大小因子(因此字面意思是Move = Resize)。在实践中,它意味着,当表单被移动时(即由用户),并且如果另一个线程通过BeginInvoke调整大小,它将在下一个Move事件发生时获得其原始大小(移动开始之前的大小)。

业务用例/示例:用户打开一个动态大小的ListBox屏幕,其中包含动态的项目列表,其人口可能需要相当长的时间。假设加载发生在并行线程中,然后调用BeginInvoke来更新DataSource。更新DataSource时,如果可能,表单大小应更改为容纳屏幕上的所有项目(如果不可能,将进行分页)。使用默认方法,如果用户在列表完成加载时将表单移动到屏幕上(到另一个屏幕将是最好的示例),则大小更新将不起作用,因为它将自动恢复为原始大小。

问题:是否有可能以某种方式覆盖移动或调整大小行为以消耗新的大小而不是恢复到原始大小?我应该调查WndProc黑客吗?

1 个答案:

答案 0 :(得分:0)

不确定我的回答是否会在3个月后有用,但我通过处理Form.ResizeBeginForm.ResizeEnd事件解决了这个问题。每当用户启动和停止在屏幕上拖动表单时,都会分别调用它们。

在ResizeBegin事件处理程序

beingMoved=true;

在BeginInvoke调用的方法中:

if(beingMoved)
    needsExplicitSizing=true;

在ResizeEnd事件处理程序中:

beingMoved=false;
if(needsExplicitSizing)
    this.Size = new Size(width,height);