gpt4 book ai didi

c# - 显示来自 mainForm 的 showDialog 不会阻止它的表单,但关闭 mainForm 将关闭它

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:03 24 4
gpt4 key购买 nike

如何显示需要同步运行的表单。我尝试从线程池的 queueworker 运行 application.run - 但有时我有一些无效的句柄。尝试使用常规线程,但是当主窗体关闭时它不会关闭它 - 我真的不喜欢在 _formclosing 上杀死线程的想法。如果我使用 form.show ,除了主窗体中的任何 showdialog 也会阻止这一事实之外,这很好。处理此问题的最佳方法是什么?

最佳答案

这是您不应该修复的问题。在显示对话框时保持表单处于启用状态是有风险的。用户可以从该表单启动在对话框处于事件状态时不应运行的代码。就像显示另一个对话框。

但是你可以用一个技巧并小心地做。 ShowDialog() 调用迭代所有打开的表单并禁用它们。您可以通过 P/调用 EnableWindow() API 函数重新启用一个。诀窍是在显示对话框时执行此操作,Control.BeginInvoke() 可以执行此操作。

这最好用一个例子来解释。它需要三个窗体和主窗体上的一个按钮,它们都具有默认名称。显示对话框时,Form2 保持非模态。您可能需要移动它,以免它隐藏在表单下方。

  public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += new EventHandler(button1_Click);
}
private Form2 mNonModal;
void button1_Click(object sender, EventArgs e) {
this.BeginInvoke(new MethodInvoker(makeNonModal));
new Form3().ShowDialog(this);
}
void makeNonModal() {
if (mNonModal != null) EnableWindow(mNonModal.Handle, true);
}
protected override void OnLoad(EventArgs e) {
mNonModal = new Form2();
mNonModal.FormClosed += (s, ea) => mNonModal = null;
mNonModal.Show();
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern void EnableWindow(IntPtr hWnd, bool enable);
}

关于c# - 显示来自 mainForm 的 showDialog 不会阻止它的表单,但关闭 mainForm 将关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2632930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com