为什么System.Windows.MessageBoxImage具有相同值的枚举子项?

时间:2010-05-17 07:37:42

标签: .net windows messagebox

我正在尝试在MessageBoxImage枚举上编写自己的抽象,并看到MessageBoxImage被定义为:

namespace System.Windows
  {
      public enum MessageBoxImage
      {
          None = 0,
          Error = 16,
          Hand = 16,
          Stop = 16,
          Question = 32,
          Exclamation = 48,
          Warning = 48,
          Asterisk = 64,
          Information = 64,
      }
  }

Show方法如何确定是显示错误图像还是手形图像? 我如何编写一个采用MessageBoxImage类型的方法,并返回一个映射到MessageBoxImage类型的CustomMessageBoxImage类型,因为我不能在同一个switch语句中同时包含MessageBoxImage.Error和MessageBoxImage.Hand?

3 个答案:

答案 0 :(得分:4)

历史上,有不同的图标最终被合并为一个实际的图标图像。因此,有几个枚举类型值(例如Hand和Stop)在现代Windows操作系统中只是意味着相同的东西。它们之间没有区别,它们只是别名。

如果你想有新的值来表示差异,那么你可以使用一个辅助变量(例如“isError”)来表达你想要在Stop和Hand之间应用的差异。或者你可以将Icon值复制到一个int和在值中设置一个高位以指示此额外信息,以便它可以在一个变量中“携带”。或者您可以使用与MessageBoxIcon“无关”的自己的枚举,并且具有从您的值转换为MessageBoxIcon值。

我建议拥有自己的“状态”值,然后根据需要将其转换为图标值 - 这两者传达的信息完全不同,因此尝试重载(损坏)MessageBox值以传达额外信息不会是一个非常好的方法。

答案 1 :(得分:0)

并非Compact Framework中提供了所有枚举(错误,信息,停止和警告)。

如果要在完整的Windows客户端和Compact Framework客户端之间共享代码文件,则需要使用Asterisk,Exclamation,Hand,None或Question枚举。

https://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxicon(v=vs.80).aspx

答案 2 :(得分:-1)

如果需要,一种解决方法是将值强制转换为int,如下所示:

var icon = MessageBoxImage.Error;

switch ((int)icon)
{
    case (int)MessageBoxImage.Error:
        // Reached by setting icon above to "Hand" and "Stop" as well.
        break;
    case (int)MessageBoxImage.Question:
        break;
    case (int)MessageBoxImage.Warning:
        // Reached by setting icon above to "Exclamation" as well.
        break;
    case (int)MessageBoxImage.Information:
        // Reached by setting icon above to "Asterisk" as well.
        break;
    default:
    case (int)MessageBoxImage.None:
        break;
}