【问题标题】:Is there a MessageBox equivalent in WPF?WPF 中是否有等效的 MessageBox?
【发布时间】:2021-06-15 14:17:34
【问题描述】:

WPF 中是否有标准消息框,例如 WinForms 的System.Windows.Forms.MessageBox.Show(),或者我应该使用 WinForms 消息框吗?

【问题讨论】:

    标签: c# wpf messagebox


    【解决方案1】:

    WPF 等效项是System.Windows.MessageBox。它有一个非常相似的接口,但对参数和返回值使用了其他枚举。

    【讨论】:

    • WPF 版本缺少重试、忽略和取消按钮组合。唯一可用的是确定和取消。
    【解决方案2】:

    在 WPF 中相当于 WinForms 的MessageBox 称为System.Windows.MessageBox

    【讨论】:

      【解决方案3】:

      正如其他人所说,WPF 命名空间中有一个MessageBox (System.Windows)。

      问题在于它与 OKCancel 等是同一个旧消息框。Windows Vista 和 Windows 7 已转而使用任务对话框。

      不幸的是,任务对话框没有简单的标准界面。我用an implementation from CodeProject KB

      【讨论】:

        【解决方案4】:

        扩展 WPF 工具包中的 MessageBox 非常好。引用工具包 DLL 后,它位于 Microsoft.Windows.Controls.MessageBox。当然,这是 2011 年 8 月 9 日发布的,所以最初它不是您的选择。大家可以通过Github 找到它。

        【讨论】:

          【解决方案5】:

          你可以用这个:

          MessageBoxResult result = MessageBox.Show("Do you want to close this window?",
                                                    "Confirmation",
                                                    MessageBoxButton.YesNo,
                                                    MessageBoxImage.Question);
          if (result == MessageBoxResult.Yes)
          {
              Application.Current.Shutdown();
          }
          

          欲了解更多信息,请访问MessageBox in WPF

          【讨论】:

          • ... 和其他答案一样,这里的命名空间将是“System.Windows”,而不是“System.Windows.Forms”
          【解决方案6】:

          WPF 包含以下 MessageBox:

          if (MessageBox.Show("Do you want to Save?", "Confirm", 
              MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
          {
          
          }
          

          【讨论】:

            【解决方案7】:

            也许下面的代码有帮助:

            using Windows.UI.Popups;
            namespace something.MyViewModels
            {
                public class TestViewModel
                {
                    public void aRandonMethode()
                    {
                        MyMessageBox("aRandomMessage");
                    }
            
                    public async void MyMessageBox(string mytext)
                    {
                        var dialog = new MessageDialog(mytext);
                        await dialog.ShowAsync();
                    }
                }
            }
            

            【讨论】:

            • Windows.UI.Popups在哪里?
            • @Nicolas 在UWP,不是 WPF
            【解决方案8】:

            在 WPF 中似乎是这段代码,

            System.Windows.Forms.MessageBox.Show("Test");
            

            替换为:

            System.Windows.MessageBox.Show("Test");
            

            【讨论】:

              【解决方案9】:

              如果你想拥有自己漂亮的 wpf MessageBox: 创建新的 Wpf 窗口

              这里是 xaml:

              <Window x:Class="popup.MessageboxNew"
                      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                      xmlns:local="clr-namespace:popup"
                      mc:Ignorable="d"
                      Title="" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterScreen" WindowStyle="None" ResizeMode="NoResize" AllowsTransparency="True" Background="Transparent" Opacity="1"
                      >
                  <Window.Resources>
              
                  </Window.Resources>
                  <Border x:Name="MainBorder" Margin="10" CornerRadius="8" BorderThickness="0" BorderBrush="Black" Padding="0" >
                      <Border.Effect>
                          <DropShadowEffect x:Name="DSE" Color="Black" Direction="270" BlurRadius="20" ShadowDepth="3" Opacity="0.6" />
                      </Border.Effect>
                      <Border.Triggers>
                          <EventTrigger RoutedEvent="Window.Loaded">
                              <BeginStoryboard>
                                  <Storyboard>
                                      <DoubleAnimation Storyboard.TargetName="DSE" Storyboard.TargetProperty="ShadowDepth" From="0" To="3" Duration="0:0:1" AutoReverse="False" />
                                      <DoubleAnimation Storyboard.TargetName="DSE" Storyboard.TargetProperty="BlurRadius" From="0" To="20" Duration="0:0:1" AutoReverse="False" />
                                  </Storyboard>
                              </BeginStoryboard>
                          </EventTrigger>
                      </Border.Triggers>
                      <Grid Loaded="FrameworkElement_OnLoaded">
                          <Grid.RowDefinitions>
                              <RowDefinition Height="Auto"/>
                          </Grid.RowDefinitions>
                          <Border Name="Mask" CornerRadius="8" Background="White" />
                          <Grid x:Name="Grid" Background="White">
                              <Grid.OpacityMask>
                                  <VisualBrush Visual="{Binding ElementName=Mask}"/>
                              </Grid.OpacityMask>
                              <StackPanel Name="StackPanel" >
                                  <TextBox Style="{DynamicResource MaterialDesignTextBox}" Name="TitleBar" IsReadOnly="True" IsHitTestVisible="False" Padding="10" FontFamily="Segui" FontSize="14" 
                                           Foreground="Black" FontWeight="Normal"
                                           Background="Yellow" HorizontalAlignment="Stretch" VerticalAlignment="Center" Width="Auto" HorizontalContentAlignment="Center" BorderThickness="0"/>
                                  <DockPanel Name="ContentHost" Margin="0,10,0,10" >
                                      <TextBlock Margin="10" Name="Textbar"></TextBlock>
                                  </DockPanel>
                                  <DockPanel Name="ButtonHost" LastChildFill="False" HorizontalAlignment="Center" >
                                      <Button Margin="10" Click="ButtonBase_OnClick" Width="70">Yes</Button>
                                      <Button Name="noBtn" Margin="10" Click="cancel_Click" Width="70">No</Button>
                                  </DockPanel>
                              </StackPanel>
                          </Grid>
                      </Grid>
                  </Border>
              </Window>
              

              这个文件的cs:

              public partial class MessageboxNew : Window
                  {
                      public MessageboxNew()
                      {
                          InitializeComponent();
                          //second time show error solved
                          if (Application.Current == null) new Application();
                                  Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
                      }
              
                      private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
                      {
                          DialogResult = true;
                      }
              
                      private void cancel_Click(object sender, RoutedEventArgs e)
                      {
                          DialogResult = false;
                      }
              
                      private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
                      {
                          this.MouseDown += delegate { DragMove(); };
                      }
                  }
              

              然后创建一个类来使用它:

              public class Mk_MessageBox
              {
                  public static bool? Show(string title, string text)
                  {
                      MessageboxNew msg = new MessageboxNew
                      {
                          TitleBar = {Text = title},
                          Textbar = {Text = text}
                      };
                      msg.noBtn.Focus();
                      return msg.ShowDialog();
                  }
              }
              

              现在您可以像这样创建您的消息框:

              var result = Mk_MessageBox.Show("Remove Alert", "This is gonna remove directory from host! Are you sure?");
                          if (result == true)
                          {
                              // whatever
                          }
              

              把这个复制到App.xaml里面

              <Application.Resources>
                  <ResourceDictionary>
                      <ResourceDictionary.MergedDictionaries>
                          <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
                          <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
                          <!-- Accent and AppTheme setting -->
                          <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
              
                          <!--two new guys-->
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.LightBlue.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Green.xaml" />
              
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
                          <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
                      </ResourceDictionary.MergedDictionaries>
                  </ResourceDictionary>
              </Application.Resources>
              

              ---------------

              我的参考: https://www.red-gate.com/simple-talk/dotnet/net-development/using-c-to-create-powershell-cmdlets-the-basics/

              for logic how can i make my own messagebox

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-02-26
                • 1970-01-01
                • 1970-01-01
                • 2013-03-04
                • 1970-01-01
                • 1970-01-01
                • 2012-12-03
                相关资源
                最近更新 更多