Come creare un MessageBox personalizzato?

Sto cercando di creare una casella di messaggio personalizzata con i miei controlli.

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

In realtà ho bisogno di posizionare alcuni controlli (una griglia) in questo modulo e devo applicare il mio tema per questa finestra, quindi non voglio usare MessageBox . Voglio chiamarlo dalle mie altre forms come

 Msg.show(parameters); 

Non desidero creare un object per questo modulo.

So che non posso ereditare dalla class Form perché non è statico. Ma mi chiedo come viene implementato MessageBox , perché è statico. Viene chiamato come MessageBox.show("Some message!");

Ora ricevo un errore perché l’ereditarietà non è consentita:

La class statica ‘MyFormName’ non può derivare dal tipo ‘System.Windows.Forms.Form’. Le classi statiche devono derivare dall’object

Screenshot del mio modulo

Come viene implementato MessageBox ?

La tua class di form non ha bisogno di essere static . In effetti, una class statica non può ereditare del tutto .

Invece, creare una class di form internal che deriva da Form e fornire un metodo di supporto public static per mostrarlo .

Questo metodo statico può essere definito in una class diversa se non si desidera che i chiamanti “sappiano” sul modulo sottostante.

 ///  /// The form internally used by  class. ///  internal partial class CustomMessageForm : Form { ///  /// This constructor is required for designer support. ///  public CustomMessageForm () { InitializeComponent(); } public CustomMessageForm (string title, string description) { InitializeComponent(); this.titleLabel.Text = title; this.descriptionLabel.Text = description; } } ///  /// Your custom message box helper. ///  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 (); } } } 

Nota a margine: come fa notare Jalal, non è necessario creare una static class per avere metodi static . Ma separerei ancora la class “helper” dalla forma attuale in modo che i chiamanti non possano creare il modulo con un costruttore (a meno che non siano nello stesso assembly, ovviamente).

Non hai bisogno che la class sia statica. Fai qualcosa come:

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

Ho appena scritto un singolo file sostitutivo per MessageBox che è un buon esempio di come “imitare” l’interfaccia statica di MessageBox. Puoi scaricarlo qui e usarlo come un MessageBox standard:

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

Saluti, Jörg

Non è necessario rendere static la class per chiamare staticamente uno dei suoi metodi : è sufficiente dichiarare il metodo particolare come static .

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

Stiamo utilizzando messageBox.ShowDialog() per visualizzare il modulo come una finestra modale . È ansible visualizzare la finestra di messaggio utilizzando DetailedMessageBox.ShowMessage("Content", "Description"); .

A proposito, dovresti riconsiderare la tua denominazione e attenersi a un modello di denominazione coerente. Msg e show sono nomi deboli che non corrispondono alle Linee guida per la denominazione : vorresti sicuramente controllarli!

In un progetto WPF puoi aggiungere una nuova finestra e chiamarla MessageBoxCustom quindi dentro C # the Void dove puoi trovare InitialiseComponent (); aggiungi 2 proprietà e associa quelle proprietà al testo Blocchi che dovresti aver creato all’interno della tua vista XAML Esempio:

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