如何使无模形式的“块”?

Xan*_*tos 1 modal-dialog winforms

我有一个可以同时显示两个窗体/窗口的应用程序。第一个通过Form.Show()方法显示,因此它是无模的并且浮到一侧。第二种形式是通过Form.ShowDialog()显示的,因此它是模式形式的,并且会阻塞。

它阻止的事实很重要,因为与第一种形式(基本上只是装饰)不同,第二种形式获取重要信息,因此我不希望我的程序在关闭之前继续运行。

不幸的是,我现在需要允许用户在显示第二个表单的同时,与第一个表单进行有限的交互(调整其大小的能力以及其他较小的视觉调整)。

显然,当第二个对话框是模式对话框时,这是行不通的。因此,要么我需要找到一种方法来使第二个表单处于无模式状态,但在打开时仍会阻塞……否则,我需要使第二个表单在模态可见时以某种方式可访问。

我是一位经验丰富的Java Swing程序员,但是我对.NET表单还很陌生,所以这里可能有一个明显的答案,我只是因为对NET api不太熟悉而想念它吗?

Han*_*ant 5

反之亦然,可以保持启用助手表格是可能的。但是,这需要一些技巧。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)

  • 哦,亲爱的,在3 1/2年前,我仍将代码缩进2个空格。时光飞逝。 (3认同)