安装期间无法最小化或移动 Winform 窗口
Posted
技术标签:
【中文标题】安装期间无法最小化或移动 Winform 窗口【英文标题】:Not able to minimize or move Winform Window during installation 【发布时间】:2021-06-15 16:18:32 【问题描述】:Winform Form Window (FixedDialog with toolbars)
提供安装和卸载应用程序的选项。 (Windows exe应用程序)
当用户点击安装/卸载按钮时,窗口既不能移动也不能最小化。 即,在为活动引发的事件未完成之前,它会卡住并且无法在表单窗口上执行任何操作。
添加事件如下,它们独立工作。 在form1.designer.cs中
private void InitializeComponent(string defaultPath)
//Other steps
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.InstallButton.Click += new System.EventHandler(this.InstallButton_Click);
this.UnInstallButton.Click += new System.EventHandler(this.UnInstallButton_Click);
例如。功能InstallButton_Click
有多个安装步骤,复制文件和完成其他工作大约需要半分钟。在此期间,它不允许移动或最小化窗口。
在form.cs中
private void InstallButton_Click(object sender, EventArgs e)
//Multiple steps for installation
//takes around 20-30 seconds to complete
这个问题类似于here 中提到的问题,但在那里看不到可接受的答案。
有没有办法让用户最小化或移动窗口?
【问题讨论】:
听起来您只是在阻止 UI。你是?显示事件处理程序。请参考minimal reproducible example。 @Sinatr,考虑到安装点击,它有安装步骤,其中涉及复制文件,大约需要 20-30 秒。在此期间不允许在窗口上进行任何活动。特别是阻止代码不是从我这边添加的。 InstallButton_Click() //安装步骤 // 如果加线程休眠应该可以生产 这能回答你的问题吗? WinForm Application UI Hangs during Long-Running Operation 轻松防止 UI 被阻止的“现代”方法是使用async
和 await
。 Duplicate 不幸的是没有这些,但它至少显示了几种方法。
Thread/BackgroundWorker/async-await 进一步可能的解决方案:***.com/a/36079335/5114784
【参考方案1】:
Here 有多种方法可供选择。
由于代码涉及更新GUI控件回来的一些步骤,无法直接使用解决方案。
由于几乎所有的解决方案都是基于asynchronous
的原理,所以曾经抛出错误,Cross-thread operation not valid: Control 'InstallButton' accessed from a thread other than the thread it was created on.
为了避免它分离涉及 GUI 控制访问的步骤并执行它们sequentially
,而剩余的独立代码使用Task.Run()
方法运行asynchronously
。
GI 的执行时间可忽略不计
//Logic to update control
Task.Run(()=>
//Remaining logic
);
【讨论】:
以上是关于安装期间无法最小化或移动 Winform 窗口的主要内容,如果未能解决你的问题,请参考以下文章
【C#】WinForm中如何让窗口最小化时直接最小化到托盘,后台运行