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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM