如何创build一个自定义的MessageBox?

我正在尝试使用我的控件制作自定义消息框。

public static partial class Msg : Form { public static void show(string content, string description) { } } 

其实我需要在这个窗体中放置一些控件(一个gridview),我必须为这个窗口应用我自己的主题,所以我不想使用MessageBox 。 我想从我的其他表格中调用这个

 Msg.show(parameters); 

我不希望为这个表单创build一个对象。

我知道我不能从Form类inheritance,因为它不是静态的。 但我不知道如何实现MessageBox ,因为它是静态的。 它被称为MessageBox.show("Some message!");

现在我得到一个错误,因为不允许inheritance:

静态类“MyFormName”不能从types“System.Windows.Forms.Form”派生。 静态类必须从对象派生

我的表单截图

MessageBox如何实现呢?

你的表单类不需要是static 。 事实上, 一个静态类不能inheritance

相反, 创build一个从Form派生的internal表单类,并提供一个public static辅助方法来显示它

如果您不希望调用者甚至“知道”底层窗体, 则可以在不同的类中定义此静态方法。

 /// <summary> /// The form internally used by <see cref="CustomMessageBox"/> class. /// </summary> internal partial class CustomMessageForm : Form { /// <summary> /// This constructor is required for designer support. /// </summary> public CustomMessageForm () { InitializeComponent(); } public CustomMessageForm (string title, string description) { InitializeComponent(); this.titleLabel.Text = title; this.descriptionLabel.Text = description; } } /// <summary> /// Your custom message box helper. /// </summary> public static class CustomMessageBox { public static void Show (string title, string description) { // using construct ensures the resources are freed when form is closed using (var form = new CustomMessageForm (title, description)) { form.ShowDialog (); } } } 

注意:正如Jalal所指出的那样 ,你不必为了使static方法在static类中而做一个static类。 但是我仍然将“helper”类从实际的表单中分离出来,所以调用者不能用构造函数创build表单(除非它们在同一个程序集中)。

你不需要这个类是静态的。 只要做一些事情:

 public partial class Msg : Form { public static void show(string content, string description) { Msg message = new Msg(...); message.show(); } } 

我刚刚写了MessageBox的单个文件replace,这是一个很好的例子,如何“模仿”MessageBox的静态接口。 你可以在这里下载并使用它像一个标准的MessageBox:

http://www.codeproject.com/Articles/601900/FlexibleMessageBox-A-flexible-replacement-for-the

问候,Jörg

你不需要static调用其中的一个静态方法 – 只要声明特定的方法是static

 public partial class DetailedMessageBox : Form { public DetailedMessageBox() { InitializeComponent(); } public static void ShowMessage(string content, string description) { DetailedMessageBox messageBox = new DetailedMessageBox(); messageBox.ShowDialog(); } } 

我们使用messageBox.ShowDialog()将窗体显示为模式窗口。 您可以使用DetailedMessageBox.ShowMessage("Content", "Description");显示消息框DetailedMessageBox.ShowMessage("Content", "Description");

顺便说一句,你应该重新考虑你的命名,并坚持一致的命名模式。 Msgshow是不符合命名指南的弱名称 – 你一定要检查这些!

在一个WPF项目中,你可以添加一个新的窗口,并将其称为MessageBoxCustom,然后在C#中的Void中findInitialiseComponent(); 您添加2个属性并将这些属性绑定到应该在XAML视图中创build的textBlocks示例:

 public MessageBoxCustom(string Message, string Title) { InitialiseComponent();//this comes first to load Front End textblock1.Text = Title; textblock2.Text = Message; } Just position your TextBlocks where you want them to be displayed in XAML From your Main Window you can call that message box like this private void Button_Click() { MessageBoxCustom msg = new MessageBoxCustom("Your message here","Your title her"); msg.ShowDialog(); }