Un MessageBox scorrevole in C #

Uso Addin in VS2008, C #, e ho bisogno di mostrare messaggi (messaggi di errore e altri).

Non conosco la lunghezza dei messaggi e, pertanto, desidero utilizzare Scrollable MessageBox.

Ho trovato questo articolo dell’anno 2007: di Mike Gold, 30 luglio 2007

http://www.c-sharpcorner.com/UploadFile/mgold/ScrollableMessageBox07292007223713PM/ScrollableMessageBox.aspx

ora, nel 2011 qualche altro buon componente ?? Voglio valutare diversi componenti a riguardo.

Aggiornare:

un altro componente ma precedente: MessageBoxExLib http://www.codeproject.com/KB/dialog/MessageBoxEx.aspx

Una finestra di messaggio Winforms personalizzabile. http://www.codeproject.com/KB/dialog/Custom_MessageBox.aspx

Prendi questo: FlexibleMessageBox – Un sostituto flessibile per .NET MessageBox

È una class testata che sostituisce senza problemi tutti gli usi di MessageBox.Show e ti consente di ottenere più funzionalità in un unico file di class che puoi facilmente aggiungere al tuo progetto.

Ho appena implementato un semplice modulo con un TextBox multilinea scorrevole, quando avevo bisogno di qualcosa di simile per mostrare report di stato lunghi o eccezioni catturate dall’applicazione. Puoi modificare i bordi, ecc. Per far sembrare più un’etichetta, se lo desideri. Quindi appena uno nuovo e chiama il suo metodo ShowDialog, o avvolgere la sua istanza in qualche membro statico simile a MessageBox. Per quanto ne so, il team di .NET non ha creato nulla di più flessibile di MessageBox.

MODIFICA DAL COMMENTO:

Il codice per creare una finestra con una casella di testo che può essere visualizzata utilizzando un metodo statico è abbastanza semplice. Anche se generalmente non mi piacciono le richieste esplicite di codice, questa volta ti obbligherò:

 public class SimpleReportViewer : Form { ///  /// Initializes a new instance of the  class. ///  //You can remove this constructor if you don't want to use the IDE forms designer to tweak its layout. public SimpleReportViewer() { InitializeComponent(); if(!DesignMode) throw new InvalidOperationException("Default constructor is for designer use only. Use static methods instead."); } private SimpleReportViewer(string reportText) { InitializeComponent(); txtReportContents.Text = reportText; } private SimpleReportViewer(string reportText, string reportTitle) { InitializeComponent(); txtReportContents.Text = reportText; Text = "Report Viewer: {0}".FormatWith(reportTitle); } ///  /// Shows a SimpleReportViewer with the specified text and title. ///  /// The report text. /// The report title. public static void Show(string reportText, string reportTitle) { new SimpleReportViewer(reportText, reportTitle).Show(); } ///  /// Shows a SimpleReportViewer with the specified text, title, and parent form. ///  /// The report text. /// The report title. /// The owner. public static void Show(string reportText, string reportTitle, Form owner) { new SimpleReportViewer(reportText, reportTitle).Show(owner); } ///  /// Shows a SimpleReportViewer with the specified text, title, and parent form as a modal dialog that prevents focus transfer. ///  /// The report text. /// The report title. /// The owner. public static void ShowDialog(string reportText, string reportTitle, Form owner) { new SimpleReportViewer(reportText, reportTitle).ShowDialog(owner); } ///  /// Shows a SimpleReportViewer with the specified text and the default window title. ///  /// The report text. public static void Show(string reportText) { new SimpleReportViewer(reportText).Show(); } ///  /// Shows a SimpleReportViewer with the specified text, the default window title, and the specified parent form. ///  /// The report text. /// The owner. public static void Show(string reportText, Form owner) { new SimpleReportViewer(reportText).Show(owner); } ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SimpleReportViewer)); this.txtReportContents = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // txtReportContents // this.txtReportContents.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.txtReportContents.Location = new System.Drawing.Point(13, 13); this.txtReportContents.Multiline = true; this.txtReportContents.Name = "txtReportContents"; this.txtReportContents.ReadOnly = true; this.txtReportContents.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.txtReportContents.Size = new System.Drawing.Size(383, 227); this.txtReportContents.TabIndex = 0; // // SimpleReportViewer // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(408, 252); this.Controls.Add(this.txtReportContents); this.Icon = Properties.Resources.some_icon; this.Name = "SimpleReportViewer"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; this.Text = "Report Viewer"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private TextBox txtReportContents; } 

Uso:

 var message = GetSomeRidiculouslyLongMessage(); //assumes it's called from inside another Form SimpleReportViewer.ShowDialog(message, "My Message", this); 

Questa particolare implementazione supporta anche la visualizzazione come finestra ordinaria, non di dialogo, utilizzando gli overload del metodo Show ().

Stavo cercando un messagebox scrollabile per WPF – e poi ho trovato MaterialMessageBox, che è un’alternativa (a mio avviso) piacevole a FlexibleMessageBox per WPF. Puoi scaricarlo da GitHub qui: https://github.com/denpalrius/Material-Message-Box o installarlo come pacchetto nuget in Visual Studio ( https://www.nuget.org/packages/MaterialMessageBox/ ).

L’unico problema che ho riscontrato è che non puoi usarlo al di fuori del thread principale, quindi la mia soluzione era invocare il thread principale e mostrare il messaggio da lì: mainWindow.Dispatcher.Invoke(() => MaterialMessageBox.Show("message text"));