Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在按alt键之前不显示模式公用对话框_C#_Winforms_Modal Dialog - Fatal编程技术网

C# 在按alt键之前不显示模式公用对话框

C# 在按alt键之前不显示模式公用对话框,c#,winforms,modal-dialog,C#,Winforms,Modal Dialog,我正在构建一个应用程序,它为一些操作显示一个模式对话框。该模式对话框是使用表单生成的,其所有者是主应用程序窗口,该窗口在Form.ShowDialog方法中作为参数传递 该模式对话框需要在单击按钮时生成一个公共对话框,(FontDialog)公共对话框也显示为模式窗口 因此,“所有者层次结构”是(A-->B表示A“拥有”B) MainApp-->ModalDialog-->FontDialog对话框 好的,问题是FontDialog无论如何都不会显示,除非我按ALT键。应用程序的行为几乎与预期的

我正在构建一个应用程序,它为一些操作显示一个模式对话框。该模式对话框是使用表单生成的,其所有者是主应用程序窗口,该窗口在Form.ShowDialog方法中作为参数传递

该模式对话框需要在单击按钮时生成一个公共对话框,(FontDialog)公共对话框也显示为模式窗口

因此,“所有者层次结构”是(A-->B表示A“拥有”B) MainApp-->ModalDialog-->FontDialog对话框

好的,问题是FontDialog无论如何都不会显示,除非我按ALT键。应用程序的行为几乎与预期的一样,即调用FontDialog.ShowDialog()时,我无法将焦点设置为MainApp窗口或ModalDialog,但FontDialog只是“不可见”,直到我按ALT键(仅该单键)然后显示

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

提前谢谢

一些代码

public class SnapshotDialogView : Form
{
        /// 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),字体对话框将显示ok。

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

yourFontDialog.ShowDialog(yourModalForm);

下面是您描述的场景的一个简单示例

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);
        };
    }
}
它没有表现出你描述的行为。这意味着您的代码中存在一些错误

我的建议是开始删除所有可以删除的代码,直到问题消失。这应该能让你了解问题所在


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

我在使用
MessageBox.Show()时遇到类似问题。

经过一些阅读/测试,我发现这是用我的一个组件重写
onPaint()
的副作用。我猜当主框架失去焦点时,它会错过刷新或其他东西,因为任何会导致它重新绘制的东西都会使MessageBox显示出来

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

    private void btn_Click(object sender, EventArgs e)
    {
        Grid.Visible = false;
        MessageBox.Show("asdf");
        Grid.Visible = true;
    }
我不确定您是否已经找到了不同的解决方案,因为这已经有几个月了。如果你找到了,我很好奇你发现了什么


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

我不习惯在.NET中编写代码,但我的win32(纯c++)代码和MessageBox()函数也遇到了类似的问题。
我错的是,我没有在WM_PAINT handler中绘制BeginPaint()和EndPaint()函数对。当我添加这两个函数并在它们之间绘制代码时,问题就消失了。虽然我不知道如何在.NET环境中做到这一点:(

我在VBNet中的MessageBox也有同样的问题

看起来像是windows,但最上面的窗口不是实际的窗口。通过在MessageBox.show之前调用BringToFront(),它解决了问题:

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

我经历了与此处所述相同的行为-在选择ALT键之前,模态对话框不会显示。最终,我在DataGridViewCellPaintingEventHandler中跟踪到了问题。我在单元格绘制事件处理程序中具有自定义某些单元格绘制的逻辑。在某些场景中,我没有设置e.Handled=true。When e.Handled未设置为true,单元格仍正确绘制,但导致模型对话框在我选择ALT键之前未显示。在所有场景中正确设置e.Handled=true解决了此问题

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

e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
e.Handled = true;
处理所有单元格的绘制似乎解决了模式对话框在按下ALT键之前不显示的问题


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

你能发布一些代码吗?这听起来真的不正常。代码很正常,但在这里,如果我在进行fontDialog.ShowDialog(此)调用之前隐藏ModalForm,它会被“解决”,但我不知道是什么原因造成的:(很抱歉,我可能没有正确地表达,或者我误解了您的意思,但我所说的ModalDialog是我用表单创建并用表单调用的对话框。ShowDialog()我想我们在这里讨论的是同一个对话框:)@Ricky,是的,我知道了,但是你的
FontDialog
?它是从你的
ModalDialog
显示的,对吗?谁是它的所有者?:)如果我在调用FontDialog.ShowDialog(MyModalForm)之前隐藏modalForm,MainAppForm拥有MyModalForm拥有FontDialog字体对话框显示正确。但我正在隐藏它,将Visible属性设置为false,而不是使用Hide()实际上,我的所有者表单有OnPaint覆盖其他解决方案吗?当我引入DataGridView.RowPrePaint事件处理程序时,我开始获取此处描述的行为-必须选择ALT键以获取要显示的模型对话框。将Grid.Visible设置为false,然后按照此答案中的描述设置为true,可以使模型框显示,但会创建poor用户体验。任何其他方法对任何人都有效吗?我在Visual Studio C#。嘿@MikePaisner我已经有一段时间没有使用winforms了,这是一个没有太多活动的老问题,因此您不太可能在此处找到其他信息。如果其他答案不能解决您的问题,则可能有助于提出新问题。我可以n告诉你,我不记得找到了不同的解决方案。我也不认为在我的实现中,网格可见性的变化对用户来说是显而易见的,但那几乎是十年前的事了,我甚至不记得它到底是用于什么项目的。@182764125216-昨天在最终确定