WPF 自定义消息框

说明:做一个简单的消息框,能够根据自定义显示图片和按钮。

步骤:

1.其实消息框就是一个Window,首先设置窗体的显示位置,显示大小,要让它看着有消息框的样子。这个很容易,代码如下:

Height="206" Width="420" WindowStartupLocation="CenterScreen" BorderThickness="1,0,1,1" ShowIcon="False" Closed="DXRibbonWindow_Closed" ResizeMode="NoResize"

2.然后我们要画出消息框,就是一个Grid,分配好空间显示图片和弹框提示,底部显示按钮,这里要注意按钮的显示是自定义选择的,所以位置设置为相对位置。代码如下:

 <Grid x:Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <!--显示图片和文本-->
        <StackPanel Grid.Row="0" VerticalAlignment="Center" Orientation="Horizontal">
            <Image Source="{Binding ImagePath}" Width="62" Height="62" Margin="40,20,20,20"/>
            <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" TextWrapping="WrapWithOverflow" Width="280" TextAlignment="Left"
                       Text="{Binding MessageBoxText}" FontSize="12"/>
        </StackPanel>
        <!--Button Margin(坐上右下)-->
        <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="确 定" x:Name="OkButton" Width="80" Height="25" Click="OkButton_Click" Margin="10,0,15,0" IsDefault="True"
                    Visibility="{Binding OkButtonVisibility,Mode=OneWay}"/>
            <Button Content="是" x:Name="YesButton" Width="80" Height="25" Click="YesButton_Click" Margin="10,0,15,0"
                    Visibility="{Binding YesButtonVisibility,Mode=OneWay}"/>
            <Button Content="否" x:Name="NoButton" Width="80" Height="25" Click="NoButton_Click" Margin="10,0,15,0"
                    Visibility="{Binding NoButtonVisibility,Mode=OneWay}"/>
            <Button Content="取消" x:Name="CancelButton" Width="80" Height="25" Click="CancelButton_Click" Margin="10,0,15,0"
                    Visibility="{Binding CancelButtonVisibility}"/>
        </StackPanel>
    </Grid>

3.定义枚举值,分别为按钮的返回值,消息框的返回值以及图标类型。代码如下:

  /// <summary>
    /// 显示按钮类型
    /// </summary>
    public enum CustomMessageBoxButton
    {
        OK=0,
        OKCancel=1,
        YesNo=2,
        YesNoCancel=3
    }
    /// <summary>
    /// 消息框的返回值
    /// </summary>
    public enum CustomMessageBoxResult
    {
        //用户直接关闭了消息窗口
        None = 0,
        //用户点击确定按钮
        OK = 1,
        //用户点击取消按钮
        Cancel = 2,
        //用户点击是按钮
        Yes = 3,
        //用户点击否按钮
        No = 4
    }
    /// <summary>
    /// 图标类型
    /// </summary>
    public enum CustomMessageBoxIcon
    {
        None = 0,
        Error = 1,
        Question = 2,
        Warning = 3
    }

4.定义属性,并且在后置代码的构造函数中将按钮全部显示为不可见。代码如下:

    #region Filed
        /// <summary>
        /// 显示的内容
        /// </summary>
        public string MessageBoxText { get; set; }
        /// <summary>
        /// 显示的图片
        /// </summary>
        public string ImagePath { get; set; }
        /// <summary>
        /// 控制显示 OK 按钮
        /// </summary>
        public Visibility OkButtonVisibility { get; set; }
        /// <summary>
        /// 控制显示 Cacncel 按钮
        /// </summary>
        public Visibility CancelButtonVisibility { get; set; }
        /// <summary>
        /// 控制显示 Yes 按钮
        /// </summary>
        public Visibility YesButtonVisibility { get; set; }
        /// <summary>
        /// 控制显示 No 按钮
        /// </summary>
        public Visibility NoButtonVisibility { get; set; }
        /// <summary>
        /// 消息框的返回值
        /// </summary>
        public CustomMessageBoxResult Result { get; set; }

        #endregion
  public CustomMessageBoxWindow()
        {
            InitializeComponent();
            this.DataContext = this;

            OkButtonVisibility = Visibility.Collapsed;
            CancelButtonVisibility = Visibility.Collapsed;
            YesButtonVisibility = Visibility.Collapsed;
            NoButtonVisibility = Visibility.Collapsed;

            Result = CustomMessageBoxResult.None;
        }

5.在按钮的事件中为按下按钮返回值赋值并且关闭窗口:

  private void OkButton_Click(object sender, RoutedEventArgs e)
        {
            Result = CustomMessageBoxResult.OK;
            this.Close();
        }

        private void YesButton_Click(object sender, RoutedEventArgs e)
        {
            Result = CustomMessageBoxResult.Yes;
            this.Close();
        }

        private void NoButton_Click(object sender, RoutedEventArgs e)
        {
            Result = CustomMessageBoxResult.No;
            this.Close();
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            Result = CustomMessageBoxResult.Cancel;
            this.Close();
        }

6.定义Show方法,根据用户自定义弹出消息框显示:

   public static CustomMessageBoxResult Show(string messageBoxText, CustomMessageBoxButton messageBoxButton, CustomMessageBoxIcon messageBoxImage)
        {
            CustomMessageBoxWindow window = new CustomMessageBoxWindow();
            window.Owner = Application.Current.MainWindow;
            window.Topmost = true;
            window.MessageBoxText = messageBoxText;
            switch (messageBoxImage)
            {
                case CustomMessageBoxIcon.Question:
                    window.ImagePath = @"/Images/question.png";
                    break;
                case CustomMessageBoxIcon.Error:
                case CustomMessageBoxIcon.Warning:
                    window.ImagePath = @"/Images/alert.png";
                    break;
            }
            switch (messageBoxButton)
            {
                case CustomMessageBoxButton.OK:
                    window.OkButtonVisibility = Visibility.Visible;
                    break;
                case CustomMessageBoxButton.OKCancel:
                    window.OkButtonVisibility = Visibility.Visible;
                    window.CancelButtonVisibility = Visibility.Visible;
                    break;
                case CustomMessageBoxButton.YesNo:
                    window.YesButtonVisibility = Visibility.Visible;
                    window.NoButtonVisibility = Visibility.Visible;
                    break;
                case CustomMessageBoxButton.YesNoCancel:
                    window.YesButtonVisibility = Visibility.Visible;
                    window.NoButtonVisibility = Visibility.Visible;
                    window.CancelButtonVisibility = Visibility.Visible;
                    break;
                default:
                    window.OkButtonVisibility = Visibility.Visible;
                    break;
            }

            window.ShowDialog();
            return window.Result;
        }

7.效果如下:

8.消息框本身就很简单,但是网上的好多例子说的有些复杂了,所以自己做了一个。消息框的显示方法我只写了一个,如果有更多需求可以重载方法就好。另外,我的VS上装了DevExpress,我用的是Dev的Ribbon Window,没装DEV的可以用普通Window,装了Dev的还是要删除引用添加自己的引用,最后源码中附上了改变窗体显示主题的代码。源码在最后上传给大家参考。

源码下载:http://files.cnblogs.com/files/damon-xu/Demo1.rar

时间: 2024-10-24 07:51:03

WPF 自定义消息框的相关文章

WPF 自定义消息框(转)

相信很多人用过MessageBox.show(),是不是觉得这个消息框有点丑呢,反正我是觉得有点丑的,所以我自己重写了一个.先不说,上两幅图对比先: 当然,也不是很好看,不过比原有的好多了. 不多说了,先上xmal代码: 1 <Window x:Class="MESBox.MEGBox" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="htt

WPF 文本框添加水印效果

有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件模板之外,其实还有一种比较简单的方式来处理.就是为我们的TextBox控件添加一个触发器,当它的文本值为空并且当它没有焦点的时候,我们就修改TextBox控件的背景样式,我们将它的背景样式设置为VisualBrush,并且在VisualBrush中添加一个TextBlock控件来显示我们需要提示的水

WPF文本框密码框添加水印效果

WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush   和触发器验证一下Text是否为空即可. 上代码: <TextBox Name="txtSerachDataName" Width="120" Height="23" Grid.Column="3" Grid.Row=&q

【Unity技巧】自定义消息框(弹出框)

写在前面 这一篇我个人认为还是很常用的,一开始也是实习的时候学到的,所以我觉得实习真的是一个快速学习工程技巧的途径. 提醒:这篇教程比较复杂,如果你不熟悉NGUI.iTween.C#的回调函数机制,那么这篇文章可能对你比较有难度,当然你可以挑战自我. 言归正传,消息框,也就是Message Box,在Windows下很常见,如下图: 在游戏里,我们也会用到这样的消息框.例如用户按了返回按钮,一般都会弹出一个确认退出的按钮.用户在执行某些重要操作时,我们总是希望再一次确认以防用户的无意操作,以此来

WPF 提示框、确认框、确认输入框

1.提示框 分为提示.异常.失败.成功几种类型 方法: /// <summary> /// 弹出提示 /// 标题:提示 /// </summary> /// <param name="strContent">内容</param> public static void ShowInfoMessageBox(string strContent) { AlertRadWindow(Application.Current.MainWindow,

wpf 图片框image 显示byte[] 类型的图片

HttpItem item = new HttpItem(); HttpHelper http = new HttpHelper(); item.URL = "http://das.app.easypass.cn/Price/VerifyCode.aspx"; item.ResultType = ResultType.Byte; HttpResult result = http.GetHtml(item); // result.ResultByte; BitmapImage bmi=n

WPF文本框只允许输入数字

XAML代码 < TextBox Height="23" HorizontalAlignment="Left" Margin="100,5,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" DataObject.Pasting="textBox1_Pasting" PreviewKeyDown=&q

WPF TextBox提示文字设定

WPF TextBox框提示文字,鼠标划入提示文字消失 <TextBox Width="248" VerticalContentAlignment="Center" BorderThickness="0" CaretBrush="White"> <TextBox.Resources> <VisualBrush x:Key="HintText" AlignmentX="

【qt学习003】渐入佳境——各种标准消息框的使用

顾名思义,消息框的作用是给用户提供一些提醒或一些简单的询问.主要由QMessageBox类实现,qt提供的这个消息框类基本涵盖了开发应用中使用的各种情况,并且提供了自定义消息框的方式,满足各种特殊的需求,在实际应用中关键是分析实际的应用需求,根据不同的应用环境选择最合适的消息框,以使程序简洁而合理. 这一次,书中连类的实现都没有,只给了一些函数接口,以后会怎么样呢?画面太残暴不敢想. 学习过程中又有了一些小收获,如qt自带的帮助文档,非常全面,当鼠标放在某个qt类的名称时,按F1就会弹出此类的说