如何创建自定义MessageBox?

时间:2011-08-03 20:22:51

标签: c# winforms forms messagebox

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

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

    }
}

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

)中调用它
Msg.show(parameters);

我不希望为此表单创建一个对象。

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

现在我收到错误,因为不允许继承:

  

静态类'MyFormName'无法从类型'System.Windows.Forms.Form'派生。静态类必须派生自对象

Screenshot of my form

如何实施MessageBox

5 个答案:

答案 0 :(得分:21)

您的表单类不必是static。事实上,一个静态类根本无法继承

相反,创建一个internal表单类,该类派生自Form并提供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 points out,您无需创建课程static即可拥有static个方法。但我仍然会将“帮助器”类与实际表单分开,这样调用者就无法使用构造函数创建表单(除非它们当然在同一个程序集中)。

答案 1 :(得分:7)

我刚刚为MessageBox编写了一个单独的文件替换,这是一个很好的例子,如何“模仿”MessageBox的静态接口。您可以在此处下载并像标准MessageBox一样使用它:

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

问候,Jörg

答案 2 :(得分:5)

您不需要该类是静态的。 做一些像:

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

答案 3 :(得分:2)

您不需要创建类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");显示消息框。

顺便说一句,你应该重新考虑你的命名并坚持一致的命名模式。 Msgshow是与Naming Guidelines不匹配的弱名称 - 您肯定想要查看这些名称!

答案 4 :(得分:-1)

在WPF项目中,您可以添加一个新窗口并将其命名为MessageBoxCustom,然后在C#中找到Void,您可以在其中找到InitialiseComponent();添加2个属性并将这些属性绑定到您应该在XAML视图中创建的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();
}