說明:做一個簡單的消息框,能夠根據自定義顯示圖片和按鈕。
步驟:
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的還是要刪除引用添加自己的引用,最后源碼中附上了改變窗體顯示主題的代碼。源碼在最后上傳給大家參考。