Xan*_*tos 1 modal-dialog winforms
我有一个可以同时显示两个窗体/窗口的应用程序。第一个通过Form.Show()方法显示,因此它是无模的并且浮到一侧。第二种形式是通过Form.ShowDialog()显示的,因此它是模式形式的,并且会阻塞。
它阻止的事实很重要,因为与第一种形式(基本上只是装饰)不同,第二种形式获取重要信息,因此我不希望我的程序在关闭之前继续运行。
不幸的是,我现在需要允许用户在显示第二个表单的同时,与第一个表单进行有限的交互(调整其大小的能力以及其他较小的视觉调整)。
显然,当第二个对话框是模式对话框时,这是行不通的。因此,要么我需要找到一种方法来使第二个表单处于无模式状态,但在打开时仍会阻塞……否则,我需要使第二个表单在模态可见时以某种方式可访问。
我是一位经验丰富的Java Swing程序员,但是我对.NET表单还很陌生,所以这里可能有一个明显的答案,我只是因为对NET api不太熟悉而想念它吗?
反之亦然,可以保持启用助手表格是可能的。但是,这需要一些技巧。ShowDialog()方法调用迭代应用程序中的顶级窗口,并在其上调用EnableWindow()以禁用它们。您可以自己调用EnableWindow来撤消此操作。棘手的一件事是,ShowDialog()无法阻止。BeginInvoke()可以解决此问题。这是一个例子:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnLoad(EventArgs e) {
mHelper = new Form2();
mHelper.Show();
mHelper.FormClosed += (s, ea) => mHelper = null;
}
Form2 mHelper;
private void EnableForm2() {
if (mHelper.IsHandleCreated) EnableWindow(mHelper.Handle, true);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool EnableWindow(IntPtr hWnd, bool enable);
private void button1_Click(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => EnableForm2()));
using (var dlg = new Form3()) {
if (dlg.ShowDialog(this) == DialogResult.OK) {
// etc...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)