【问题标题】:Message Box with Yes and No buttons带有是和否按钮的消息框
【发布时间】:2014-04-26 16:37:19
【问题描述】:

我正在使用 Windows Phone 8,我遇到了在消息框中询问用户的情况,因此用户必须单击“是”或“否”。

但是消息框只有确定和取消按钮,我不需要它。

这是我的代码:

MessageBoxResult m = MessageBox.Show("Are you sure? This will delete all your data", "Attention!", MessageBoxButton.OKCancel);
            if (m == MessageBoxResult.Cancel)
            {

            }
            else
            {
                MessageBox.Show("Data Deleted", "Done", MessageBoxButton.OK);
            } 

如何将其修改为“是”和“否”按钮?我也可以有 3 个按钮以及按钮上的自定义文本吗?

【问题讨论】:

    标签: c# wpf silverlight windows-phone-8 windows-phone


    【解决方案1】:
    if (MessageBox.Show("Are you sure?", "Attention!!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    //this block will be executed when Yes is selected
                    MessageBox.Show("Data Deleted", "Done", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
                else
                {
                    //this block will be executed when No is selected
                }
    

    【讨论】:

      【解决方案2】:

      您可以使用此自定义消息框

      SLMessageBox.xaml

      <controls:ChildWindow x:Class="SLMessageBoxEX.SLMessageBox"
                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
                        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
                        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
                        Title="SL Custom Message Box"
                        Width="320"
                        Height="150">
      <controls:ChildWindow.Resources>
          <Style x:Key="TextBoxStyle" TargetType="TextBox">
              <Setter Property="Template">
                  <Setter.Value>
                      <ControlTemplate TargetType="TextBox">
                          <Grid x:Name="RootElement">
                              <ScrollViewer x:Name="ContentElement"
                                            Background="{TemplateBinding Background}"
                                            BorderThickness="0"
                                            Padding="{TemplateBinding Padding}" />
                          </Grid>
                      </ControlTemplate>
                  </Setter.Value>
              </Setter>
          </Style>
      </controls:ChildWindow.Resources>
      <controls:ChildWindow.Style>
          <StaticResource ResourceKey="AlertBoxStyle" />
      </controls:ChildWindow.Style>
      
      <Grid x:Name="LayoutRoot" Margin="2">
           <Grid.RowDefinitions>
              <RowDefinition Height="80" />
              <RowDefinition Height="Auto" />
          </Grid.RowDefinitions>
      
          <TextBox x:Name="txtMsg"
                   Width="195"
                   Margin="59,22,0,22"
                   HorizontalAlignment="Left"
                   VerticalAlignment="Center"
                   Background="#02FFFFFF"
                   BorderBrush="{x:Null}"
                   Cursor="Arrow"
                   FontSize="11"
                   FontWeight="SemiBold"
                   IsReadOnly="True"
                   SelectionBackground="#FF727272"
                   Style="{StaticResource TextBoxStyle}"
                   Text="SysInformation Healthcare India Pvt Ltd."
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
          <StackPanel Grid.Row="1"
                      HorizontalAlignment="Center"
                      Orientation="Horizontal">
              <Button x:Name="btnYes"
                      Width="65"
                      Height="23"
                      Margin="10,0,5,0"
                      Click="OKButton_Click"
                      Content="Yes"
                      Style="{StaticResource ButtonStyle1}" />
              <Button x:Name="btnNo"
                      Width="65"
                      Height="23"
                      Margin="5,0,5,0"
                      Click="btnNo_Click"
                      Content="No"
                      Style="{StaticResource ButtonStyle1}" />
              <Button x:Name="btnCancel"
                      Width="65"
                      Height="23"
                      Margin="5,0,5,0"
                      Click="CancelButton_Click"
                      Content="Cancel"
                      Style="{StaticResource ButtonStyle1}" />
          </StackPanel>
      
          <Image x:Name="imgIcon"
                 Width="45"
                 Height="40"
                 Margin="10,20,0,20"
                 HorizontalAlignment="Left"
                 VerticalAlignment="Center">
              <Image.Effect>
                  <DropShadowEffect Color="#FF434343" />
              </Image.Effect>
          </Image>
      
      </Grid>
      

      SLMessageBox.xaml.cs

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Net;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Documents;
      using System.Windows.Input;
      using System.Windows.Media;
      using System.Windows.Media.Animation;
      using System.Windows.Media.Imaging;
      using System.Windows.Shapes;
      
      namespace SLMessageBoxEX
      {
      public partial class SLMessageBox : ChildWindow
      {
          public delegate void MessageBoxClosedDelegate(MessageBoxResult result);
          public event MessageBoxClosedDelegate OnMessageBoxClosed;
          public MessageBoxResult Result { get; set; }
      
          public SLMessageBox(string title, string message, MessageBoxButtons buttons,MessageBoxIcon icon)
          {
              InitializeComponent();
              this.Closed += new EventHandler(MessageBoxChildWindow_Closed);
      
              this.Title = title;
              this.txtMsg.Text = message;
              DisplayButtons(buttons);
              DisplayIcon(icon);
          }
      
          public enum MessageBoxButtons
          {
              Ok, YesNo, YesNoCancel, OkCancel
          }
      
          public enum MessageBoxIcon
          {
              Question, Information, Error, None, Warning, Logout, ThankYou
          }
      
          private void DisplayIcon(MessageBoxIcon icon)
          {
              switch (icon)
              {
                  case MessageBoxIcon.Error:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBox;component/Images/error.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.Information:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBoxEX;component/Images/Information.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.Question:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBoxEX;component/Images/SIHIImages/question.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.Warning:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBoxEX;component/Images/warning.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.None:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBox;component/Images/Information.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.Logout:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBoxEX;component/Images/logout1.png", UriKind.Relative));
                      break;
      
                  case MessageBoxIcon.ThankYou:
                      imgIcon.Source = new BitmapImage(new Uri("/SLMessageBoxEX;component/Images/ThankYou.png", UriKind.Relative));
                      break;
              }
          }
      
          private void DisplayButtons(MessageBoxButtons buttons)
          {
      
              switch (buttons)
              {
                  case MessageBoxButtons.Ok:
                      btnCancel.Visibility = Visibility.Collapsed;
                      btnNo.Visibility = Visibility.Collapsed;
                      btnYes.Visibility = Visibility.Visible;
                      btnYes.Content = "Ok";
                      break;
      
                  case MessageBoxButtons.OkCancel:
                      btnCancel.Visibility = Visibility.Visible;
                      btnNo.Visibility = Visibility.Collapsed;
                      btnYes.Visibility = Visibility.Visible;
                      btnYes.Content = "Ok";
                      break;
      
                  case MessageBoxButtons.YesNo:
                      btnCancel.Visibility = Visibility.Collapsed;
                      btnNo.Visibility = Visibility.Visible;
                      btnYes.Visibility = Visibility.Visible;
                      break;
      
                  case MessageBoxButtons.YesNoCancel:
                      btnCancel.Visibility = Visibility.Visible;
                      btnNo.Visibility = Visibility.Visible;
                      btnYes.Visibility = Visibility.Visible;
                      break;
              }
          }
      
          private void MessageBoxChildWindow_Closed(object sender, EventArgs e)
          {
              if (OnMessageBoxClosed != null)
                  OnMessageBoxClosed(this.Result);
          }
      
          private void OKButton_Click(object sender, RoutedEventArgs e)
          {
              if (btnYes.Content.ToString().ToLower().Equals("yes") == true)
              {
                  //yes button
                  this.Result = MessageBoxResult.Yes;
              }
              else
              {
                  //ok button
                  this.Result = MessageBoxResult.OK;
              }
      
              this.Close();
          }
      
          private void CancelButton_Click(object sender, RoutedEventArgs e)
          {
              this.Result = MessageBoxResult.Cancel;
              this.Close();
          }
      
          private void btnNo_Click(object sender, RoutedEventArgs e)
          {
              this.Result = MessageBoxResult.Cancel;
              this.Close();
          }
      }
      

      }

      你可以调用这个消息框

      对于是否按钮

      SLMessageBox messBox;
      messBox = new SLMessageBox("Message", "Yes or No Message Box...!", SLMessageBox.MessageBoxButtons.YesNo, SLMessageBox.MessageBoxIcon.Information);
      messBox.Show();
      

      仅适用于确定按钮

      SLMessageBox messBox;
      messBox = new SLMessageBox("Message", "Ok Message Box...!", SLMessageBox.MessageBoxButtons.Ok, SLMessageBox.MessageBoxIcon.Information);
      messBox.Show();
      

      确定和取消按钮

      SLMessageBox messBox;
      messBox = new SLMessageBox("Message", "Ok and Cancel Message Box...!", SLMessageBox.MessageBoxButtons.OkCancel, SLMessageBox.MessageBoxIcon.Information);
      messBox.Show();
      

      编辑: 并检查用户单击的 MessageBox 的结果

      SLMessageBox messBox;
      messBox = new SLMessageBox("Message", "Yes, No and Cancel Buttons Message Box...!", SLMessageBox.MessageBoxButtons.YesNoCancel, , SLMessageBox.MessageBoxIcon.Information);
      messBox.Show();
      messBox.OnMessageBoxClosed += messBox_OnDeleteMessageBoxClosed;
      
      private void messBox_OnDeleteMessageBoxClosed(MessageBoxResult result)
      {
         if(result==MessageBoxResult.Yes)
         {
           //....
         }
         else if(result==MessageBoxResult.No)
         {
           //....
         }
         else
         {
           //...
         }
      }
      

      【讨论】:

      • 我试试这个,我也可以三个按钮吗?
      • 是的,它在 YesNoCancel 按钮中。公共枚举 MessageBoxButtons { Ok, YesNo, YesNoCancel, OkCancel }
      • 好的,那就是 SLMessageBox.MessageBoxButtons.YesNoCancel 吧?
      • 我也可以修改名称是,否和取消,如自定义名称?
      • @Goofy 我已经编辑了我的答案。是的,您可以修改按钮名称。
      【解决方案3】:

      另一个选择是使用 XNA 框架中的 Guide 类。有一个 BeginShowMessageBox 方法,让您可以选择传入按钮所需的任何字符串。

      点击以下链接

      link 1

      link 2

      link 3

      【讨论】:

        【解决方案4】:

        API 仅公开“确定”和“取消”。如果您需要使用不同的按钮,恐怕您必须使用自定义消息框。

        例如http://shawnoster.com/2012/10/welcome-custommessagebox-to-the-windows-phone-toolkit/

        http://blogs.microsoft.co.il/tomershamam/2010/10/19/windows-phone-7-custom-message-box/

        【讨论】:

          【解决方案5】:

          API 仅公开 OK/Cancel。您可以使用来自Coding4FunToolkit 的 Coding4Fun MessagePrompt 创建是/否消息:

          MessagePrompt msgPrompt = new MessagePrompt();
          msgPrompt.Message = "Your Message.";
          Button yesBtn = new Button() { Content = "Yes" };
          yesBtn.Click += new RoutedEventHandler(yesBtn_Click);
          Button noBtn = new Button() { Content = "No" };
          noBtn.Click += new RoutedEventHandler(noBtn_Click);
          msgPrompt.ActionPopUpButtons.Add(noBtn);
          msgPrompt.ActionPopUpButtons.Add(yesBtn);
          msgPrompt.Show();
          

          【讨论】:

          • 是的,我会尝试并告诉你。
          • MessagePrompt 需要使用哪个程序集?
          • 这里我有一个刻度按钮以及是和否按钮,如何删除刻度按钮?
          【解决方案6】:

          不,MessageBox 是密封类型。

          您需要制作自己的 MessageBox 控件,该控件具有“是”和“否”按钮。

          【讨论】:

          • 好的,你能告诉我如何创建我自己的消息框吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多