首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C# 自訂 MessageBox 美化完整教學:從樣板到可複用元件

     編輯:更多程式設計知識

動機

預設 MessageBox.Show() 風格受限於系統主題,無法符合品牌識別或高對比度需求。本文示範建立 FrmMessageBox 表單,支援 資訊/詢問/錯誤 三種樣式、自動適應文字寬度、回傳 DialogResult。

一、表單設計 (WinForms 設計師)

二、列舉與建構函式


public enum MsgStyle { Info, Question, Error }

public partial class FrmMessageBox : Form {
    public FrmMessageBox(MsgStyle style, string message) {
        InitializeComponent();

        // 圖示與標題
        switch (style) {
            case MsgStyle.Info:
                picIcon.Image = Properties.Resources.info;   // 專案資源加入 info.png
                Text = "提示";
                pnlOk.Visible = true; pnlYesNo.Visible = false;
                break;
            case MsgStyle.Question:
                picIcon.Image = Properties.Resources.question;
                Text = "詢問";
                pnlOk.Visible = false; pnlYesNo.Visible = true;
                break;
            case MsgStyle.Error:
                picIcon.Image = Properties.Resources.error;
                Text = "錯誤";
                pnlOk.Visible = true; pnlYesNo.Visible = false;
                break;
        }

        lblMsg.Text = message;
        AdjustSize(message);
    }

    // 依文字寬度自動調整表單與按鈕寬度
    private void AdjustSize(string msg) {
        using (var g = CreateGraphics()) {
            var sz = TextRenderer.MeasureText(msg, lblMsg.Font);
            int minW = 300, maxW = 800;
            int w = Math.Min(Math.Max(sz.Width + 130, minW), maxW);
            Width = w;
            pnlOk.Width = pnlYesNo.Width = w - 40;
            btnOk.Width = w - 60;
            btnYes.Width = btnNo.Width = (w - 80) / 2;
        }
    }
}

三、靜態輔助方法 (單行呼叫)


public static class MsgBox {
    public static DialogResult Show(MsgStyle style, string msg, string title = "") {
        using (var box = new FrmMessageBox(style, msg)) {
            if (!string.IsNullOrEmpty(title)) box.Text = title;
            return box.ShowDialog();
        }
    }
    public static DialogResult Info(string msg) => Show(MsgStyle.Info, msg);
    public static DialogResult Question(string msg) => Show(MsgStyle.Question, msg);
    public static DialogResult Error(string msg) => Show(MsgStyle.Error, msg);
}

四、使用範例


// 簡單資訊
MsgBox.Info("資料已儲存!");

// 詢問確認
if (MsgBox.Question("確定要刪除這筆記錄?") == DialogResult.Yes) {
    DeleteRecord();
}

// 錯誤提示
try { RiskyOperation(); }
catch (Exception ex) { MsgBox.Error("操作失敗:" + ex.Message); }

五、進階擴充建議

  1. 主題化:引入 ColorTheme 類別,支援 Light/Dark/HighContrast 三套配色,於建構函式套用。
  2. 圖示向量化:使用 SVG 或 FontAwesome 字型圖示,解決 DPI 縮放模糊。
  3. 非模態模式:加入 ShowAsync() 回傳 Task<DialogResult>,配合 await 使用。
  4. 自動關閉:加入 autoCloseMs 參數,內部啟動 Timer 到期自動 Close()。
  5. 本地化:按鈕文字、標題從資源檔 .resx 讀取,支援多語系。

六、常見問題

控制項名稱關鍵屬性
PictureBoxpicIconSizeMode=Zoom, Dock=Left
LabellblMsgAutoSize=False, Dock=Fill, TextAlign=MiddleLeft, Font=微軟正黑體 12pt
Panel (單按鈕)pnlOkDock=Bottom, Visible=False
ButtonbtnOkText="確定(&O)", DialogResult=OK, Dock=Right
Panel (雙按鈕)pnlYesNoDock=Bottom, Visible=False
ButtonbtnYesText="是(&Y)", DialogResult=Yes, Dock=Left
ButtonbtnNoText="否(&N)", DialogResult=No, Dock=Right
問題解決
ShowDialog() 回傳 Cancel確認按鈕 DialogResult 屬性正確設定,且 Form.AcceptButton/CancelButton 指向對應按鈕
長文字被截斷lblMsg.AutoSize=False + Dock=Fill + AdjustSize() 計算寬度
多執行緒呼叫 UI 凍結使用 Invoke 或 BeginInvoke 切換到 UI 執行緒建立表單

結語

自訂 MessageBox 不僅提升視覺一致性,更能整合品牌識別、無障礙設計與本地化需求。以上架構採用「表單+靜態輔助類」模式,易於維護與擴充,可直接納入專案共用程式庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved