C# 消息框模式

C# 消息框模式,c#,winforms,messagebox,C#,Winforms,Messagebox,我已经断断续续地工作了一段时间,但本质上我有一个类,我调用它来显示消息框 我试图让我的消息框是模态的,如果您指定要使用模态的表单,这很容易做到 所以我的表单是这样声明的 public partial class MainForm : Form var mainForm = new MainForm(); MainForm.ActiveForm.Invoke(new MethodInvoker(delegate { MessageBox.Show(MainForm.ActiveForm

我已经断断续续地工作了一段时间,但本质上我有一个类,我调用它来显示消息框

我试图让我的消息框是模态的,如果您指定要使用模态的表单,这很容易做到

所以我的表单是这样声明的

public partial class MainForm : Form
var mainForm = new MainForm();
MainForm.ActiveForm.Invoke(new MethodInvoker(delegate
{
    MessageBox.Show(MainForm.ActiveForm, message, title, buttons, icon);
}));
它是这样实例化的

public partial class MainForm : Form
var mainForm = new MainForm();
MainForm.ActiveForm.Invoke(new MethodInvoker(delegate
{
    MessageBox.Show(MainForm.ActiveForm, message, title, buttons, icon);
}));
因此,我有一个类,其中包含打开消息框的方法,如下所示

public partial class MainForm : Form
var mainForm = new MainForm();
MainForm.ActiveForm.Invoke(new MethodInvoker(delegate
{
    MessageBox.Show(MainForm.ActiveForm, message, title, buttons, icon);
}));
这可以正常工作,但活动窗体仅在窗体处于活动状态时工作


无论如何,有没有一个简单的方法来解决这个问题呢?

我是个新手,但是MessageBox不是已经是模态了吗?如果你在制作自己的messagebox,你就不能只做
messageboxform.ShowDialog()

我是个C#新手,但MessageBox不是已经有模式了吗?如果你在制作自己的messagebox,你就不能只做
messageboxform.ShowDialog()

如果您只想避免使用第一个参数,则有几个用于Winforms Messagebox的显示方法

你可以试试这个:

public static DialogResult Show(
    string text,
    string caption,
    MessageBoxButtons buttons,
    MessageBoxIcon icon,
    MessageBoxDefaultButton defaultButton
 )
所以对你来说:

MessageBox.Show(message, title, buttons, icon);
编辑:
我认为这应该是模态的(没有第一个参数),因为它是从主窗体调用的。

如果您只想避免使用第一个参数,则有一些Winforms Messagebox的显示方法

你可以试试这个:

public static DialogResult Show(
    string text,
    string caption,
    MessageBoxButtons buttons,
    MessageBoxIcon icon,
    MessageBoxDefaultButton defaultButton
 )
所以对你来说:

MessageBox.Show(message, title, buttons, icon);
编辑:
我相信这应该是模态的(没有第一个参数),因为它是从主窗体调用的。

我有一个相当好的解决方案,但我不确定是否有更优雅的解决方案

所以在MainForm.cs中我有

public static Form mainWindow { get; private set; }
然后在OnLoad方法中

Focus();
BringToFront();
mainWindow = MainForm.ActiveForm;
然后在我的消息框方法中:

MainForm.mainWindow.Invoke(new MethodInvoker(delegate
{
    MainForm.mainWindow.BringToFront();
    MessageBox.Show(MainForm.mainWindow, message, title, MessageBoxButtons.OK, icon);
}));

我是不是遗漏了什么?有没有比mainWindow=MainForm.ActiveForm更好的替代方案?

我有一个效果相当好的解决方案,但我不确定是否有更优雅的解决方案

所以在MainForm.cs中我有

public static Form mainWindow { get; private set; }
然后在OnLoad方法中

Focus();
BringToFront();
mainWindow = MainForm.ActiveForm;
然后在我的消息框方法中:

MainForm.mainWindow.Invoke(new MethodInvoker(delegate
{
    MainForm.mainWindow.BringToFront();
    MessageBox.Show(MainForm.mainWindow, message, title, MessageBoxButtons.OK, icon);
}));

我是不是遗漏了什么?是否有更好的替代mainWindow=MainForm.ActiveForm的方法?

这对我很有用:

MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);

Form.ActiveForm将为您提供当前活动的表单,即使您正在从任何其他类提升MessageBox。

这对我很有用:

MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);

Form.ActiveForm将为您提供当前活动的表单,即使您是从任何其他类提升MessageBox。

遗憾的是,ShowDialog是WPF windows而不是WinForms的方法。您可以在windows中使用Form.ShowDialog,但不能使用MessageBoxforms@funseiki不,我很确定您可以使用.ShowDialog()在windows窗体中。@MicahArmantrout他可以制作自己的窗体,就像MessageBox一样,然后使用.ShowDialog()。@MicahArmantrout和Jutanium你是对的,这两种方法都适用,我的错误。遗憾的是,ShowDialog是WPF windows而不是WinForms的一种方法。在windows中可以有form.ShowDialog,但不能有MessageBoxforms@funseiki不我很确定你可以在windows窗体中使用.ShowDialog()。@MicahArmantrout他可以制作自己的窗体,就像MessageBox一样,然后使用.ShowDialog()。@MicahArmantrout和Jutanium你是对的,这两个都适用,我错了。“MessageBox是模态的”这些消息框是从Windows.System.forms.form继承的,还是您在谈论messagebox.show?“消息框是模态的”这些消息框是从Windows.System.forms.form继承的,还是您在谈论messagebox.show?如果不指定第一个参数,消息框是桌面的模态。如果未指定第一个参数,则消息框是桌面的模态。另一个选项是设置mainWindow=FindForm();另一个选项是设置mainWindow=FindForm();在有载方法中。