我正在尝试在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?
答案 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;
}