自定义MessageBox WPF

时间:2014-02-13 23:55:34

标签: .net wpf messagebox

从这个链接我想显示一个像

这样的MessageBox

UI

  

格式化将清除此磁盘上的所有数据。

在那个名为按钮的格式上 我没有发现它是一个MessageBox 怎么做的?
这只是一个自定义模态窗口吗?

这似乎很接近但不重命名按钮

MessageBox.Show

我知道你不应该在标题中使用标签,但已经有Custom MessageBox标题,但它处理的是表格。

5 个答案:

答案 0 :(得分:3)

您可以使用WPF Toolkit自定义MessageBox
然后更改 OkButtonContent
设置确定按钮的内容。

https://wpftoolkit.codeplex.com/wikipage?title=MessageBox

答案 1 :(得分:3)

实现您的目标:

  1. 创建继承自Window
  2. 的自定义窗口控件

    例如

    public partial class CustomMessageBoxWindow:Window {}

    1. 设计该窗口的布局。 您将需要标题的标签。左侧的图像和显示消息的标签。另外,您可能需要添加各种按钮,例如是/否,确定/取消。

    2. 通过使用其他课程来揭露您的所作所为。我们说CustomMessageBox。

    3. link提供了一个实现,您可以查看。

答案 2 :(得分:2)

试试这段代码,

public class MsgBox : Form
{
    private const int CS_DROPSHADOW = 0x00020000;
    private static MsgBox _msgBox;
    private Panel _plHeader = new Panel();
    private Panel _plFooter = new Panel();
    private Panel _plIcon = new Panel();
    private PictureBox _picIcon = new PictureBox();
    private FlowLayoutPanel _flpButtons = new FlowLayoutPanel();
    private Label _lblTitle;
    private Label _lblMessage;
    private List<Button> _buttonCollection = new List<Button>();
    private static DialogResult _buttonResult = new DialogResult();
    private static Timer _timer;
    private static Point lastMousePos;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern bool MessageBeep(uint type);

    private MsgBox()
    {
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.BackColor = Color.FromArgb(0, 50, 90);
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Padding = new System.Windows.Forms.Padding(3);
        this.Width = 400;

        _lblTitle = new Label();
        _lblTitle.ForeColor = Color.White;
        _lblTitle.Font = new System.Drawing.Font("Segoe UI", 18);
        _lblTitle.Dock = DockStyle.Top;
        _lblTitle.Height = 50;

        _lblMessage = new Label();
        _lblMessage.ForeColor = Color.White;
        _lblMessage.Font = new System.Drawing.Font("Segoe UI", 10);
        _lblMessage.Dock = DockStyle.Fill;

        _flpButtons.FlowDirection = FlowDirection.RightToLeft;
        _flpButtons.Dock = DockStyle.Fill;

        _plHeader.Dock = DockStyle.Fill;
        _plHeader.Padding = new Padding(20);
        _plHeader.Controls.Add(_lblMessage);
        _plHeader.Controls.Add(_lblTitle);

        _plFooter.Dock = DockStyle.Bottom;
        _plFooter.Padding = new Padding(20);
        _plFooter.BackColor = Color.FromArgb(0, 0, 90);
        _plFooter.Height = 80;
        _plFooter.Controls.Add(_flpButtons);

        _picIcon.Width = 32;
        _picIcon.Height = 32;
        _picIcon.Location = new Point(30, 50);

        _plIcon.Dock = DockStyle.Left;
        _plIcon.Padding = new Padding(20);
        _plIcon.Width = 70;
        _plIcon.Controls.Add(_picIcon);

        List<Control> controlCollection = new List<Control>();
        controlCollection.Add(this);
        controlCollection.Add(_lblTitle);
        controlCollection.Add(_lblMessage);
        controlCollection.Add(_flpButtons);
        controlCollection.Add(_plHeader);
        controlCollection.Add(_plFooter);
        controlCollection.Add(_plIcon);
        controlCollection.Add(_picIcon);

        foreach (Control control in controlCollection)
        {
            control.MouseDown += MsgBox_MouseDown;
            control.MouseMove += MsgBox_MouseMove;
        }

        this.Controls.Add(_plHeader);
        this.Controls.Add(_plIcon);
        this.Controls.Add(_plFooter);
    }

    private static void MsgBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            lastMousePos = new Point(e.X, e.Y);
        }
    }


    private static void MsgBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _msgBox.Left += e.X - lastMousePos.X;
            _msgBox.Top += e.Y - lastMousePos.Y;
        }
    }

    public static DialogResult Show(string message)
    {
        _msgBox = new MsgBox();
        _msgBox._lblMessage.Text = message;

        MsgBox.InitButtons(Buttons.OK);

        _msgBox.ShowDialog();
        MessageBeep(0);
        return _buttonResult;
    }

    public static DialogResult Show(string message, string title)
    {
        _msgBox = new MsgBox();
        _msgBox._lblMessage.Text = message;
        _msgBox._lblTitle.Text = title;
        _msgBox.Size = MsgBox.MessageSize(message);

        MsgBox.InitButtons(Buttons.OK);

        _msgBox.ShowDialog();
        MessageBeep(0);
        return _buttonResult;
    }

    public static DialogResult Show(string message, string title, Buttons buttons)
    {
        _msgBox = new MsgBox();
        _msgBox._lblMessage.Text = message;
        _msgBox._lblTitle.Text = title;
        _msgBox._plIcon.Hide();

        MsgBox.InitButtons(buttons);

        _msgBox.Size = MsgBox.MessageSize(message);
        _msgBox.ShowDialog();
        MessageBeep(0);
        return _buttonResult;
    }

    public static DialogResult Show(string message, string title, Buttons buttons, Icon icon)
    {
        _msgBox = new MsgBox();
        _msgBox._lblMessage.Text = message;
        _msgBox._lblTitle.Text = title;

        MsgBox.InitButtons(buttons);
        MsgBox.InitIcon(icon);

        _msgBox.Size = MsgBox.MessageSize(message);
        _msgBox.ShowDialog();
        MessageBeep(0);
        return _buttonResult;
    }

    public static DialogResult Show(string message, string title, Buttons buttons, Icon icon, AnimateStyle style)
    {
        _msgBox = new MsgBox();
        _msgBox._lblMessage.Text = message;
        _msgBox._lblTitle.Text = title;
        _msgBox.Height = 0;

        MsgBox.InitButtons(buttons);
        MsgBox.InitIcon(icon);

        _timer = new Timer();
        Size formSize = MsgBox.MessageSize(message);

        switch (style)
        {
            case MsgBox.AnimateStyle.SlideDown:
                _msgBox.Size = new Size(formSize.Width, 0);
                _timer.Interval = 1;
                _timer.Tag = new AnimateMsgBox(formSize, style);
                break;

            case MsgBox.AnimateStyle.FadeIn:
                _msgBox.Size = formSize;
                _msgBox.Opacity = 0;
                _timer.Interval = 20;
                _timer.Tag = new AnimateMsgBox(formSize, style);
                break;

            case MsgBox.AnimateStyle.ZoomIn:
                _msgBox.Size = new Size(formSize.Width + 100, formSize.Height + 100);
                _timer.Tag = new AnimateMsgBox(formSize, style);
                _timer.Interval = 1;
                break;
        }

        _timer.Tick += timer_Tick;
        _timer.Start();

        _msgBox.ShowDialog();
        MessageBeep(0);
        return _buttonResult;
    }

    static void timer_Tick(object sender, EventArgs e)
    {
        Timer timer = (Timer)sender;
        AnimateMsgBox animate = (AnimateMsgBox)timer.Tag;

        switch (animate.Style)
        {
            case MsgBox.AnimateStyle.SlideDown:
                if (_msgBox.Height < animate.FormSize.Height)
                {
                    _msgBox.Height += 17;
                    _msgBox.Invalidate();
                }
                else
                {
                    _timer.Stop();
                    _timer.Dispose();
                }
                break;

            case MsgBox.AnimateStyle.FadeIn:
                if (_msgBox.Opacity < 1)
                {
                    _msgBox.Opacity += 0.1;
                    _msgBox.Invalidate();
                }
                else
                {
                    _timer.Stop();
                    _timer.Dispose();
                }
                break;

            case MsgBox.AnimateStyle.ZoomIn:
                if (_msgBox.Width > animate.FormSize.Width)
                {
                    _msgBox.Width -= 17;
                    _msgBox.Invalidate();
                }
                if (_msgBox.Height > animate.FormSize.Height)
                {
                    _msgBox.Height -= 17;
                    _msgBox.Invalidate();
                }
                break;
        }
    }

    private static void InitButtons(Buttons buttons)
    {
        switch (buttons)
        {
            case MsgBox.Buttons.AbortRetryIgnore:
                _msgBox.InitAbortRetryIgnoreButtons();
                break;

            case MsgBox.Buttons.OK:
                _msgBox.InitOKButton();
                break;

            case MsgBox.Buttons.OKCancel:
                _msgBox.InitOKCancelButtons();
                break;

            case MsgBox.Buttons.RetryCancel:
                _msgBox.InitRetryCancelButtons();
                break;

            case MsgBox.Buttons.YesNo:
                _msgBox.InitYesNoButtons();
                break;

            case MsgBox.Buttons.YesNoCancel:
                _msgBox.InitYesNoCancelButtons();
                break;
        }

        foreach (Button btn in _msgBox._buttonCollection)
        {
            btn.ForeColor = Color.FromArgb(170, 170, 170);
            btn.Font = new System.Drawing.Font("Segoe UI", 8);
            btn.Padding = new Padding(3);
            btn.FlatStyle = FlatStyle.Flat;
            btn.Height = 30;
            btn.FlatAppearance.BorderColor = Color.FromArgb(99, 99, 98);

            _msgBox._flpButtons.Controls.Add(btn);
        }
    }

    private static void InitIcon(Icon icon)
    {
        switch (icon)
        {
            case MsgBox.Icon.Application:
                _msgBox._picIcon.Image = SystemIcons.Application.ToBitmap();
                break;

            case MsgBox.Icon.Exclamation:
                _msgBox._picIcon.Image = SystemIcons.Exclamation.ToBitmap();
                break;

            case MsgBox.Icon.Error:
                _msgBox._picIcon.Image = SystemIcons.Error.ToBitmap();
                break;

            case MsgBox.Icon.Info:
                _msgBox._picIcon.Image = SystemIcons.Information.ToBitmap();
                break;

            case MsgBox.Icon.Question:
                _msgBox._picIcon.Image = SystemIcons.Question.ToBitmap();
                break;

            case MsgBox.Icon.Shield:
                _msgBox._picIcon.Image = SystemIcons.Shield.ToBitmap();
                break;

            case MsgBox.Icon.Warning:
                _msgBox._picIcon.Image = SystemIcons.Warning.ToBitmap();
                break;
        }
    }

    private void InitAbortRetryIgnoreButtons()
    {
        Button btnAbort = new Button();
        btnAbort.Text = "Abort";
        btnAbort.Click += ButtonClick;

        Button btnRetry = new Button();
        btnRetry.Text = "Retry";
        btnRetry.Click += ButtonClick;

        Button btnIgnore = new Button();
        btnIgnore.Text = "Ignore";
        btnIgnore.Click += ButtonClick;

        this._buttonCollection.Add(btnAbort);
        this._buttonCollection.Add(btnRetry);
        this._buttonCollection.Add(btnIgnore);
    }

    private void InitOKButton()
    {
        Button btnOK = new Button();
        btnOK.Text = "OK";
        btnOK.Click += ButtonClick;

        this._buttonCollection.Add(btnOK);
    }

    private void InitOKCancelButtons()
    {
        Button btnOK = new Button();
        btnOK.Text = "OK";
        btnOK.Click += ButtonClick;

        Button btnCancel = new Button();
        btnCancel.Text = "Cancel";
        btnCancel.Click += ButtonClick;


        this._buttonCollection.Add(btnOK);
        this._buttonCollection.Add(btnCancel);
    }

    private void InitRetryCancelButtons()
    {
        Button btnRetry = new Button();
        btnRetry.Text = "OK";
        btnRetry.Click += ButtonClick;

        Button btnCancel = new Button();
        btnCancel.Text = "Cancel";
        btnCancel.Click += ButtonClick;


        this._buttonCollection.Add(btnRetry);
        this._buttonCollection.Add(btnCancel);
    }

    private void InitYesNoButtons()
    {
        Button btnYes = new Button();
        btnYes.Text = "Yes";
        btnYes.Click += ButtonClick;

        Button btnNo = new Button();
        btnNo.Text = "No";
        btnNo.Click += ButtonClick;


        this._buttonCollection.Add(btnYes);
        this._buttonCollection.Add(btnNo);
    }

    private void InitYesNoCancelButtons()
    {
        Button btnYes = new Button();
        btnYes.Text = "Abort";
        btnYes.Click += ButtonClick;

        Button btnNo = new Button();
        btnNo.Text = "Retry";
        btnNo.Click += ButtonClick;

        Button btnCancel = new Button();
        btnCancel.Text = "Cancel";
        btnCancel.Click += ButtonClick;

        this._buttonCollection.Add(btnYes);
        this._buttonCollection.Add(btnNo);
        this._buttonCollection.Add(btnCancel);
    }

    private static void ButtonClick(object sender, EventArgs e)
    {
        Button btn = (Button)sender;

        switch (btn.Text)
        {
            case "Abort":
                _buttonResult = DialogResult.Abort;
                break;

            case "Retry":
                _buttonResult = DialogResult.Retry;
                break;

            case "Ignore":
                _buttonResult = DialogResult.Ignore;
                break;

            case "OK":
                _buttonResult = DialogResult.OK;
                break;

            case "Cancel":
                _buttonResult = DialogResult.Cancel;
                break;

            case "Yes":
                _buttonResult = DialogResult.Yes;
                break;

            case "No":
                _buttonResult = DialogResult.No;
                break;
        }

        _msgBox.Dispose();
    }

    private static Size MessageSize(string message)
    {
        Graphics g = _msgBox.CreateGraphics();
        int width = 350;
        int height = 230;

        SizeF size = g.MeasureString(message, new System.Drawing.Font("Segoe UI", 10));

        if (message.Length < 150)
        {
            if ((int)size.Width > 350)
            {
                width = (int)size.Width;
            }
        }
        else
        {
            string[] groups = (from Match m in Regex.Matches(message, ".{1,180}") select m.Value).ToArray();
            int lines = groups.Length + 1;
            width = 700;
            height += (int)(size.Height + 10) * lines;
        }
        return new Size(width, height);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Graphics g = e.Graphics;
        Rectangle rect = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1));
        Pen pen = new Pen(Color.FromArgb(0, 151, 251));

        g.DrawRectangle(pen, rect);
    }

    public enum Buttons
    {
        AbortRetryIgnore = 1,
        OK = 2,
        OKCancel = 3,
        RetryCancel = 4,
        YesNo = 5,
        YesNoCancel = 6
    }

    public enum Icon
    {
        Application = 1,
        Exclamation = 2,
        Error = 3,
        Warning = 4,
        Info = 5,
        Question = 6,
        Shield = 7,
        Search = 8
    }

    public enum AnimateStyle
    {
        SlideDown = 1,
        FadeIn = 2,
        ZoomIn = 3
    }

}

class AnimateMsgBox
{
    public Size FormSize;
    public MsgBox.AnimateStyle Style;

    public AnimateMsgBox(Size formSize, MsgBox.AnimateStyle style)
    {
        this.FormSize = formSize;
        this.Style = style;
    }
}

您可以在代码中使用此消息框,如

MsgBox.Show("Are you sure you want to close the Application ?", "Confirmation", MsgBox.Buttons.YesNo, MsgBox.Icon.Question, MsgBox.AnimateStyle.FadeIn);

或者如果要检查结果,单击哪个按钮

        var result = MsgBox.Show("Are you sure you want to close the Application ?", "Confirmation", MsgBox.Buttons.YesNo, MsgBox.Icon.Question, MsgBox.AnimateStyle.FadeIn);

        if (result == System.Windows.Forms.DialogResult.No)
        {
            ////do whatever you want
        }

您的消息框将如下所示

enter image description here

如果您想更改背景颜色,请在此处更改

this.BackColor = Color.FromArgb(0, 50, 90);

_plFooter.BackColor = Color.FromArgb(0, 0, 90);

答案 3 :(得分:1)

答案 4 :(得分:0)

MessageBox.Show上有一些重载可以发出消息:

MessageBox.Show("Formatting will erase all data on this disk. \nTo format the disk, click OK.  To quit, click Cancel.", 
     "Format Local Disk (F:)", 
     MessageBoxButton.OKCancel,
     MessageBoxImage.Exclamation);

MessageBoxButton枚举可让您在OKOKCancelYesNoYesNoCancel之间进行选择。如果你想要不同的按钮,我恐怕你必须使用其他答案的建议并创建你自己的窗口。