.NET Core中类似于messageBox的方法

8
在.NET Core中,是否有像MessageBox.Show这样显示弹出消息的方法?
2个回答

7

便宜的替代方案之一的问题在于,在Linux(或Mac)上没有等效的功能。

所以,你可以使用许多皮诺克和结构来编写自己的函数,或者你可以使用“notify-send”命令,在Linux上打开一个“通知气泡”。

WindowManager.MsgBoxResult result = WindowManager.Interaction
    .MsgBox("Message", "Title", MsgBoxStyle.OkCancel);

这是我的实现:

namespace WindowManager
{


    public enum MsgBoxResult
        : int
    {
        Abort = 3,
        Cancel = 2,
        Ignore = 5,
        No = 7,
        Ok = 1,
        Retry = 4,
        Yes = 6
    }

    //[System.Flags]
    //public enum MsgBoxStyle
    //    : int
    //{
    //    AbortRetryIgnore = 2,
    //    ApplicationModal = 0,
    //    Critical = 0x10,
    //    DefaultButton1 = 0,
    //    DefaultButton2 = 0x100,
    //    DefaultButton3 = 0x200,
    //    Exclamation = 0x30,
    //    Information = 0x40,
    //    MsgBoxHelp = 0x4000,
    //    MsgBoxRight = 0x80000,
    //    MsgBoxRtlReading = 0x100000,
    //    MsgBoxSetForeground = 0x10000,
    //    OkCancel = 1,
    //    OkOnly = 0,
    //    Question = 0x20,
    //    RetryCancel = 5,
    //    SystemModal = 0x1000,
    //    YesNo = 4,
    //    YesNoCancel = 3
    //}


    [System.Flags]
    public enum MsgBoxStyle
    {
        /// <summary>
        /// OK button only (default). This member is equivalent to the Visual Basic constant <see langword="vbOKOnly" />.</summary>
        OkOnly = 0,
        /// <summary>
        /// OK and Cancel buttons. This member is equivalent to the Visual Basic constant <see langword="vbOKCancel" />.</summary>
        OkCancel = 1,
        /// <summary>
        /// Abort, Retry, and Ignore buttons. This member is equivalent to the Visual Basic constant <see langword="vbAbortRetryIgnore" />.</summary>
        AbortRetryIgnore = 2,
        /// <summary>
        /// Yes, No, and Cancel buttons. This member is equivalent to the Visual Basic constant <see langword="vbYesNoCancel" />.</summary>
        YesNoCancel = AbortRetryIgnore | OkCancel, // 0x00000003
                                                   /// <summary>
                                                   /// Yes and No buttons. This member is equivalent to the Visual Basic constant <see langword="vbYesNo" />.</summary>
        YesNo = 4,
        /// <summary>
        /// Retry and Cancel buttons. This member is equivalent to the Visual Basic constant <see langword="vbRetryCancel" />.</summary>
        RetryCancel = YesNo | OkCancel, // 0x00000005
                                        /// <summary>Critical message. This member is equivalent to the Visual Basic constant <see langword="vbCritical" />.</summary>
        Critical = 16, // 0x00000010
                       /// <summary>Warning query. This member is equivalent to the Visual Basic constant <see langword="vbQuestion" />.</summary>
        Question = 32, // 0x00000020
                       /// <summary>Warning message. This member is equivalent to the Visual Basic constant <see langword="vbExclamation" />.</summary>
        Exclamation = Question | Critical, // 0x00000030
                                           /// <summary>Information message. This member is equivalent to the Visual Basic constant <see langword="vbInformation" />.</summary>
        Information = 64, // 0x00000040
                          /// <summary>First button is default. This member is equivalent to the Visual Basic constant <see langword="vbDefaultButton1" />.</summary>
        DefaultButton1 = 0,
        /// <summary>Second button is default. This member is equivalent to the Visual Basic constant <see langword="vbDefaultButton2" />.</summary>
        DefaultButton2 = 256, // 0x00000100
                              /// <summary>Third button is default. This member is equivalent to the Visual Basic constant <see langword="vbDefaultButton3" />.</summary>
        DefaultButton3 = 512, // 0x00000200
                              /// <summary>Application modal message box. This member is equivalent to the Visual Basic constant <see langword="vbApplicationModal" />.</summary>
        ApplicationModal = 0,
        /// <summary>System modal message box. This member is equivalent to the Visual Basic constant <see langword="vbSystemModal" />.</summary>
        SystemModal = 4096, // 0x00001000
                            /// <summary>Help text. This member is equivalent to the Visual Basic constant <see langword="vbMsgBoxHelp" />.</summary>
        MsgBoxHelp = 16384, // 0x00004000
                            /// <summary>Right-aligned text. This member is equivalent to the Visual Basic constant <see langword="vbMsgBoxRight" />.</summary>
        MsgBoxRight = 524288, // 0x00080000
                              /// <summary>Right-to-left reading text (Hebrew and Arabic systems). This member is equivalent to the Visual Basic constant <see langword="vbMsgBoxRtlReading" />.</summary>
        MsgBoxRtlReading = 1048576, // 0x00100000
                                    /// <summary>Foreground message box window. This member is equivalent to the Visual Basic constant <see langword="vbMsgBoxSetForeground" />.</summary>
        MsgBoxSetForeground = 65536, // 0x00010000
    }


    // https://learn.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messagebox
    internal class UnsafeNativeMethods 
    {
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        internal static extern MsgBoxResult MessageBox(System.IntPtr hWnd, string text, string caption, MsgBoxStyle options);
    }


    public class Interaction
    {


        private static string GetTitleFromAssembly(System.Reflection.Assembly CallingAssembly)
        {
            try
            {
                return CallingAssembly.GetName().Name;
            }
            catch (System.Security.SecurityException)
            {
                string fullName = CallingAssembly.FullName;
                int index = fullName.IndexOf(',');
                if (index >= 0)
                {
                    return fullName.Substring(0, index);
                }
                return "";
            }
        }


        public static MsgBoxResult MsgBox(string text, string caption, MsgBoxStyle options)
        {
            if (string.IsNullOrEmpty(caption))
                caption = GetTitleFromAssembly(System.Reflection.Assembly.GetCallingAssembly());

            if (System.Environment.OSVersion.Platform != System.PlatformID.Unix)
                return UnsafeNativeMethods.MessageBox(System.IntPtr.Zero, text, caption, options);

            text = text.Replace("\"", @"\""");
            caption = caption.Replace("\"", @"\""");

            using (System.Diagnostics.Process p = System.Diagnostics.Process.Start("notify-send", "\"" + caption + "\" \"" + text + "\""))
            {
                p.WaitForExit();
            }

            return MsgBoxResult.Ok;
        }


        public static MsgBoxResult MsgBox(string text, string caption)
        {
            return MsgBox(text, caption, MsgBoxStyle.OkOnly);
        }


        public static MsgBoxResult MsgBox(string text)
        {
            return MsgBox(text, null);
        }


        public static MsgBoxResult MsgBox(object objText, object objCaption)
        {
            string text = System.Convert.ToString(objText, System.Globalization.CultureInfo.InvariantCulture);
            string caption = System.Convert.ToString(objCaption, System.Globalization.CultureInfo.InvariantCulture);

            return MsgBox(text, caption);
        }


        public static MsgBoxResult MsgBox(object objText)
        {
            return MsgBox(objText, null);
        }


    } // End Class Interaction


} // End Namespace WindowManager 

1

更新:

是的,.NetCore 3.0+支持WPF/Windows Forms

John Dyer在评论中指出,

VB用户可以使用以下代码显示消息框: https://learn.microsoft.com/en-us/dotnet/api/system.windows.messagebox?view=netcore-3.1

原始答案2017:

不支持。.NET Core专注于Web,Messagebox是Winforms的东西。而且.NET Core没有Winforms支持。

一个或多个官方回答“为什么没有Microsoft.UI.WinForms .Net Core包”

我的团队(微软.NET团队)专注于将.NET Core作为云和Web框架。我们知道人们希望我们为.NET Core构建其他应用程序类型,但现在我们仍然专注于我们已经开始的工作。许多其他开发人员希望我们继续专注于.NET Core,这也是我们的意图。

https://github.com/dotnet/core/issues/374


2
Sharky在2017年的回答是正确的,但现在随着.NET Core 3.1的推出,VB用户可以使用以下代码来显示消息框: https://learn.microsoft.com/en-us/dotnet/api/system.windows.messagebox?view=netcore-3.1 - John Dyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接