繁体   English   中英

如何在不使用等待/异步获取结果的情况下制作像 WPF 消息框这样的自定义弹出窗口?

[英]How can I make a custom popup likes a WPF MessageBox without using await/async to get its result?

我目前开发了一个自定义弹出窗口,它需要使用 await/async 来等待用户交互,然后等待它的结果。

但我意识到 WPF MessageBox 不需要使用 await/async 来等待结果。

如何在不使用等待/异步的情况下制作像 MessageBox 一样的自定义弹出窗口?

在此处输入图像描述

你可以这样做:

public partial class CustomMessageBox
{
    private MessageBoxResult? _result;

    private CustomMessageBox()
    {
        InitializeComponent();
    }

    public static MessageBoxResult? Show(string message)
    {
        return Show(message, "Message", MessageBoxButton.OK);
    }

    public static MessageBoxResult? Show(string message, string caption)
    {
        return Show(message, caption, MessageBoxButton.OK);
    }

    public static MessageBoxResult? Show(string message, string caption, MessageBoxButton buttons)
    {
        var box = new CustomMessageBox();
        box.TbMessage.Text = message;
        box.BtnCancel.Visibility = Visibility.Collapsed;
        box.BtnYesNoCancel.Visibility = Visibility.Collapsed;
        box.BtnOk.Visibility = Visibility.Collapsed;
        box.BtnYes.Visibility = Visibility.Collapsed;
        box.BtnNo.Visibility = Visibility.Collapsed;

        switch (buttons)
        {
            case MessageBoxButton.OK:
                box.BtnOk.Visibility = Visibility.Visible;
                break;
            case MessageBoxButton.OKCancel:
                box.BtnCancel.Visibility = Visibility.Visible;
                box.BtnOk.Visibility = Visibility.Visible;
                break;
            case MessageBoxButton.YesNoCancel:
                box.BtnCancel.Visibility = Visibility.Visible;
                box.BtnYes.Visibility = Visibility.Visible;
                box.BtnYesNoCancel.Visibility = Visibility.Visible;
                box.BtnNo.Visibility = Visibility.Visible;
                break;
            case MessageBoxButton.YesNo:
                box.BtnYes.Visibility = Visibility.Visible;
                box.BtnNo.Visibility = Visibility.Visible;
                break;
            default:
                throw new ArgumentOutOfRangeException(nameof(buttons), buttons, null);
        }

        box.ShowDialog();

        return box._result;
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        if (ReferenceEquals(sender, BtnYes))
        {
            _result = MessageBoxResult.Yes;
        }

        if (ReferenceEquals(sender, BtnNo))
        {
            _result = MessageBoxResult.No;
        }

        if (ReferenceEquals(sender, BtnOk))
        {
            _result = MessageBoxResult.OK;
        }

        if (ReferenceEquals(sender, BtnCancel) || ReferenceEquals(sender, BtnYesNoCancel))
        {
            _result = MessageBoxResult.Cancel;
        }


        Close();
    }
}

和 XAML

<Window x:Class="StackOverflow.Views.CustomMessageBox"
    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"
    mc:Ignorable="d"
    Title="Message" 
    MinHeight="95" 
    MinWidth="280"
    SizeToContent="WidthAndHeight" 
    MaxHeight="500"
    MaxWidth="600" 
    WindowStartupLocation="CenterScreen">
<DockPanel LastChildFill="True" Margin="10">
    <TextBlock x:Name="TbMessage" TextAlignment="Left" VerticalAlignment="Top" TextWrapping="WrapWithOverflow"
               HorizontalAlignment="Left" DockPanel.Dock="Top"/>

    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Bottom" HorizontalAlignment="Right">
        <Button Content="OK" Click="ButtonBase_OnClick" Width="50" x:Name="BtnOk"/>
        <Button Content="Cancel" Click="ButtonBase_OnClick" Width="80" Margin="10 0 0 0" x:Name="BtnCancel"/>
        <Button Content="Yes" Click="ButtonBase_OnClick" Margin="0 0 10 0" Width="50" x:Name="BtnYes" />
        <Button Content="No" Click="ButtonBase_OnClick" Width="50" x:Name="BtnNo" />
        <Button Content="Cancel" Click="ButtonBase_OnClick" Width="80" Margin="10 0 0 0" x:Name="BtnYesNoCancel"/>
    </StackPanel>
 
</DockPanel>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM