直到按下alt键才显示模态公共对话框

时间:2010-11-23 21:31:39

标签: c# winforms modal-dialog

我正在构建一个显示某个操作的模式对话框的应用程序。该模式对话框是使用Form构建的,并且具有作为所有者的主应用程序窗口,该窗口在Form.ShowDialog方法中作为参数传递。

当单击一个按钮时,该模态对话框需要生成一个公共对话框,(FontDialog)一个常见的对话框也显示为一个模态窗口。

所以“所有者等级”是(A - > B表示A“拥有”B) MainApp - > ModalDialog - > FontDialog类

好的,问题是FontDialog无论如何都没有显示,除非我按下ALT键。应用程序的行为几乎与预期一致,即当我调用FontDialog.ShowDialog()时,我无法将焦点设置为MainApp窗口和ModalDialog,但FontDialog只是“不可见”,直到我按下ALT键(只有那个)键)然后出现。

任何人都知道为什么会这样?我尝试将FormDialog的所有者设置为null(因此使用桌面作为所有者窗口),但它的行为方式相同。

提前致谢。

一些代码     公共类SnapshotDialogView:表单     {             /// bla bla bla

        ///
        /// Button click handler
        private void btnChangeFont_Click(object sender, EventArgs e)
        {
            // this.Owner == MainAppWindow
            DialogResult result = fontDialog.ShowDialog(this);

            if (DialogResult.Cancel == result)
                return;

            Presenter.ChangeLabelsFont(fontDialog.Font);
        }
}
啊,是的,还有一件事。如果我在调用FontDialog.ShowDialog()之前隐藏了ModalDialogForm(代码中的SnapshotDialogView),则字体对话框显示正常。

6 个答案:

答案 0 :(得分:4)

使用MessageBox.Show()时遇到了类似的问题 经过一些阅读/测试后,我发现这是我的一个组件覆盖onPaint()的副作用。我猜它在主框架失去焦点时会错过刷新或其他东西,因为任何导致它重绘的东西都会让MessageBox显示出来。

我的快速解决方案是在显示对话框之前设置组件Visible = false,并在以下情况下将其设置为true:

    private void btn_Click(object sender, EventArgs e)
    {
        Grid.Visible = false;
        MessageBox.Show("asdf");
        Grid.Visible = true;
    }

我不确定你是否已经找到了一个不同的解决方案,因为这已经有几个月了。如果你这样做,我很好奇你发现了什么。

编辑:我刚刚阅读了您的评论,看起来我们找到了类似的解决方案。

答案 1 :(得分:1)

以下是您描述的方案的一个简单示例。

using System;
using System.Drawing;
using System.Windows.Forms;

public class MainAppForm : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainAppForm());
    }
    public MainAppForm()
    {
        Text = "MainAppForm";
        Controls.Add(new Button { Text = "Show ModalDialog", AutoSize = true, Location = new Point(10, 10) });
        Controls[0].Click += (s, e) =>
            {
                using (ModalDialog dlg = new ModalDialog())
                    dlg.ShowDialog(this);
            };
    }
}

public class ModalDialog : Form
{
    public ModalDialog()
    {
        Text = "ModalDialog";
        Controls.Add(new Button { Text = "Show FontDialog", AutoSize = true, Location = new Point(10, 10) });
        Controls[0].Click += (s, e) =>
        {
            using (FontDialog dlg = new FontDialog())
                dlg.ShowDialog(this);
        };
    }
}

它没有展示您描述的行为。这意味着您的代码中存在某些错误。

我建议您开始删除所有代码,直到问题消失为止。这应该能够解决问题所在。

或者,您可以从上述程序开始,然后开始添加代码,直到问题出现。

答案 2 :(得分:1)

我不习惯在.NET中编码,但我遇到了与win32(纯c ++)代码和MessageBox()函数类似的问题。 我错的是我没有在WM_PAINT处理程序中的BeginPaint()和EndPaint()函数对中完成我的绘图。一旦我添加了这两个函数并在它们之间完成了我的绘图代码,问题就消失了。虽然我不知道如何在.NET环境中完成:(

答案 3 :(得分:1)

我遇到了与此处所述相同的行为-直到选择了ALT键,模态对话框才会显示。最终,我将问题归结为在DataGridViewCellPaintingEventHandler中。我在单元格绘画事件处理程序中具有逻辑以自定义某些单元格的绘画。在某些情况下,我没有设置e.Handled = true。如果未将e.Handled设置为true,则单元格仍可以正确绘制,但导致在我选择ALT键之前无法显示“模型对话框”。在所有已解决的问题中正确设置e.Handled = true。

此外,以前,我只是为需要自定义的单元格自定义绘画。现在,我正在绘画和处理所有单元格。对于单元格,我不需要自定义,请执行以下操作:

e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
e.Handled = true;

处理所有单元格的绘画似乎已经解决了在按下ALT之前不显示“模态对话框”的问题。

希望这对某人有帮助,因为它与提供的其他答案有些不同。

答案 4 :(得分:0)

尝试将您的模式表单用作FontDialog的所有者:

yourFontDialog.ShowDialog(yourModalForm);

答案 5 :(得分:0)

我在VBNet中遇到了与MessageBox相同的问题。

虽然最顶层的窗口不是真正的窗口,但它看起来像是窗户。通过在MessageBox.show之前调用BringToFront()来解决问题:

Me.BringToFront()
MessageBox.Show("blablabla", Me.Text, 
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question)