调暗不活动的表格

Nez*_*eli 1 .net winforms

当使用Form.ShowDialog()打开Dialog表单时,我想用灰色阴影调暗其余的应用程序.

根据我自己的研究,似乎要做到这一点的方法是打开一个黑色背景和不透明度低于100%的无边框形式,但我没有将所有部分放在一起如何工作或者它是最好的方法.

任何的意见都将会有帮助.谢谢.

Han*_*ant 5

最好通过将打开的表单与另一个无边框且大小相同的表单重叠来完成.这允许您确保禁用整个表单,包括控件和标题栏.在项目中添加一个新类并粘贴此代码:

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

class DialogOverlay : IDisposable {
    public DialogOverlay() {
        var cnt = Application.OpenForms.Count;
        for (int ix = 0; ix < cnt; ++ix) {
            var form = Application.OpenForms[ix];
            var overlay = new Form { Location = form.Location, Size = form.Size, FormBorderStyle = FormBorderStyle.None,
                ShowInTaskbar = false, StartPosition = FormStartPosition.Manual, AutoScaleMode = AutoScaleMode.None };
            overlay.Opacity = 0.3;
            overlay.BackColor = Color.Gray;
            overlay.Show(form);
            forms.Add(overlay);
        }
    }
    public void Dispose() {
        foreach (var form in forms) form.Close();
    }
    private List<Form> forms = new List<Form>();
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

    private void DialogButton_Click(object sender, EventArgs e) {
        using (new DialogOverlay()) 
        using (var dlg = new Dialog()) {
            if (dlg.ShowDialog(this) == DialogResult.OK) {
                // etc...
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

调整Opacity和BackColor属性以调整效果.它适用于任何类型的对话框,包括OpenFileDialog等内置对象,以及应用程序中的任何开放表单集.请注意Application.OpenForms是一个小小的错误.