Как создать собственный 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?

Ответ 1

Ваш класс формы не должен быть 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 , вам не нужно создавать класс static, чтобы иметь в нем методы static. Но я все равно отделяю класс "помощник" от фактической формы, чтобы вызывающие не могли создать форму с помощью конструктора (если они не находятся в одной и той же сборке, конечно).

Ответ 2

Вам не нужно, чтобы класс был статичным. Просто сделайте что-нибудь вроде:

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

Ответ 3

Я только что написал одну замену файла для MessageBox, что является хорошим примером того, как "имитировать" статический интерфейс MessageBox. Вы можете скачать его здесь и использовать как стандартный MessageBox:

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

С уважением, Йорг

Ответ 4

Вам не нужно создавать класс 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");.

Кстати, вы должны переосмыслить свое именование и придерживаться последовательного шаблона именования. Msg и show являются слабыми именами, которые не соответствуют Правилам присвоения имен - вы определенно захотите проверить их!

Ответ 5

В проекте WPF вы можете добавить новое окно и вызвать его MessageBoxCustom, а затем внутри С# the Void, где вы можете найти InitialiseComponent(); вы добавляете 2 свойства и привязываете эти свойства к текстовым блокам, которые вы должны были создать в своем представлении XAML Пример:

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