How to create a custom MessageBox?

和自甴很熟 提交于 2019-11-26 17:48:25
Dan Abramov

Your form class needs not to be static. In fact, a static class cannot inherit at all.

Instead, create an internal form class that derives from Form and provide a public static helper method to show it.

This static method may be defined in a different class if you don't want the callers to even “know” about the underlying form.

/// <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 ();
        }
    }
}

Side note: as Jalal points out, you don't have to make a class static in order to have static methods in it. But I would still separate the “helper” class from the actual form so the callers cannot create the form with a constructor (unless they're in the same assembly of course).

I have just written a single file replacement for MessageBox that is a good example how to "imitate" the static interface of MessageBox. You can download it here and use it like a standard MessageBox:

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

Regards, Jörg

You don't need the class to be static. Just do something like:

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

You don't need to make the class static in order to call one of its methods statically — it's sufficient to declare the particular method as static.

public partial class DetailedMessageBox : Form
{
    public DetailedMessageBox()
    {
        InitializeComponent();
    }

    public static void ShowMessage(string content, string description)
    {
        DetailedMessageBox messageBox = new DetailedMessageBox();
        messageBox.ShowDialog();
    }
}

We are using messageBox.ShowDialog() to have the form being displayed as a modal window. You can display the message box using DetailedMessageBox.ShowMessage("Content", "Description");.

By the way, you should rethink your naming and stick to a consistent naming pattern. Msg and show are weak names that do no match the Naming Guidelines — you would definitely want to check those out!

TGB

In a WPF project you can add a new window and call it MessageBoxCustom then inside C# the Void where you can find InitialiseComponent(); you add 2 properties and bind those properties to the textBlocks you should have created inside your XAML view Example:

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();
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!