Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 移动时保持窗体大小(如果从另一个线程更改)?_Winforms_User Interface - Fatal编程技术网

Winforms 移动时保持窗体大小(如果从另一个线程更改)?

Winforms 移动时保持窗体大小(如果从另一个线程更改)?,winforms,user-interface,Winforms,User Interface,通过实验,我发现在执行移动时会触发Resize事件。不仅如此,移动操作还保留了调整大小的因子,因此实际上移动=调整大小。实际上,这意味着,当表单被用户移动时,如果另一个线程通过BeginInvoke调整它的大小,它将获得它在下一个移动事件发生时开始移动之前的原始大小 业务用例/示例:用户打开一个具有动态大小的列表框的屏幕,其中包含项目的动态列表,其填充可能需要相当长的时间。假设加载发生在并行线程中,然后调用BeginInvoke来更新数据源。当数据源更新时,表单大小应该改变以适应屏幕上的所有项目

通过实验,我发现在执行移动时会触发Resize事件。不仅如此,移动操作还保留了调整大小的因子,因此实际上移动=调整大小。实际上,这意味着,当表单被用户移动时,如果另一个线程通过BeginInvoke调整它的大小,它将获得它在下一个移动事件发生时开始移动之前的原始大小

业务用例/示例:用户打开一个具有动态大小的列表框的屏幕,其中包含项目的动态列表,其填充可能需要相当长的时间。假设加载发生在并行线程中,然后调用BeginInvoke来更新数据源。当数据源更新时,表单大小应该改变以适应屏幕上的所有项目,如果可能的话,将进行分页。使用默认方法,如果用户在屏幕上移动表单到另一个屏幕,那么大小更新将不起作用。最好的例子是当列表完成加载时,它将自动恢复为原始大小


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

我不确定我的答案是否会在3个月后有用,但我通过处理Form.ResizeBegin和Form.ResizeEnd事件解决了这个问题。每当用户开始和停止在屏幕上拖动窗体时,将分别调用这些函数

在ResizeBegin事件处理程序中

beingMoved=true;
在BeginInvoke调用的方法中:

if(beingMoved)
    needsExplicitSizing=true;
在ResizeEnd事件处理程序中:

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

我的建议是忘记这样做,永远不要以编程方式调整表单的大小。这是用户自己做的。并尽量记住用户选择的大小。这是预期的行为,如果您不调整表单大小以适应数据,则没有用户会责怪您。就我个人而言,当软件试图以这种方式与我玩聪明游戏时,我觉得很烦人。@Mike:谢谢你的回复。问题在于它是一个通用的选择列表/选择器,可能包含1项,也可能超过200项,具体取决于上下文。它有200个项目,几乎占据了整个屏幕。现在,相比之下,想象一个普通的白色屏幕上有一个孤独的项目-当然不会看起来很酷。根据您的想法,这里有一个变通方法:当用户移动表单时,不要自动调整大小。相反,可以选择手动大小以适应表单,即按钮,并让用户这样做。这不是最终的解决方案,但肯定比我目前的方法要好。问题是,人们期望应用程序有某种行为,而没有表现出这种行为的应用程序被认为是怪异的。我的意思是,看看windows资源管理器:当你打开一个只有一个文件的文件夹时,它不会自动调整大小,是吗?人们习惯于这种行为,这是他们认为正常的行为。“大小合适”按钮是一个很好的主意。@Mike:总的来看,得分不错。但explorer有点不同,因为在任何时候,同一个屏幕可能包含不同数量的项目。更好的是,项目的数量会随着您的工作而变化。由于该拾取列表是一个dialog=volatile表单,所以在用户做出选择之前,它只需要存在。这就是关于生产力的问题。如果您希望看到尽可能多的项目,同时也希望看到尽可能多的其他屏幕不动产,那么这可能有助于您做出正确的选择,您不希望此对话框自动调整大小以适应吗?@neolik:我想看看您的解决方案。我有一个启动屏幕,我应该使增长的开始菜单,它的设计大小在中央屏幕上。我试着使用下面介绍的ResizeBegin和ResizeEnd方法,但它们从来没有启动过。我找到了相同的解决方案,方法略有不同。基线是您将此大小更改推迟到可以安全处理为止。还有更多的警告,但我会把你的帖子标记为答案,因为这个问题没有答案。谢谢