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