在WinForms和WPF中都可以使用的抽象MessageBox结果?
在WinForms和WPF中都可以使用的抽象MessageBox结果?
我在另一个标题下发布了这个问题,但这是一个更具描述性的标题。这是我正在使用的一个旧库中找到的一个函数:
Friend Function GetResponse(ByVal MsgText As String, Optional ByVal DialogTitle As String = "Error Log", Optional ByVal MsgButtons As MessageBoxButtons = MessageBoxButtons.OK, Optional BoxIcon As MessageBoxIcon = MessageBoxIcon.Information) As DialogResult Return MessageBox.Show(MsgText, DialogTitle, MsgButtons, MessageBoxIcon.Question) End Function
这是在WinForms时代编写的,但现在我正在将一些代码移至WPF和更新的版本。因此,诸如MessageBoxIcon和DialogResult之类的东西不存在,代码将无法编译。
我可以返回bool而不是DialogResult,但诸如MessageBoxIcon之类的东西具有不同的名称,并且在WPF下位于不同的库中。似乎这应该是使用IFDEF的地方,但那会触发什么?是否有一个const告诉您您在WPF vs WinForms vs.其他环境中?还是有其他方法可以创建一个适用于任何一种环境的单个MsgBox?
我不是要用新代码替换MessageBox,我想要一个在WinForms和WPF中都能工作的单个方法,因为我有使用这个库中其他代码的项目,所以必须包含它。
如果你不再积极地维护这个库,或者这个库本身不太可能在未来发生太多变化,那么请将其翻译为WPF。你不一定想增加对System.Windows.Forms.dll的依赖,仅仅为了避免写一点额外的代码。
否则,你可以考虑编写一个WPF包装器,将WPF枚举转换为winforms枚举。但是,如果你提供的代码是库本身的一个公平样本,那么维护一个包装器可能会像维护库本身的WPF版本一样费力。
你可以使用依赖注入:重写库以使用某种IMessageBox
接口。这个库的每个客户端,无论是winforms还是WPF,都将提供自己的IMessageBox
实现。这将是一个愉快而有利可图的编程练习。
你可以在WPF项目中添加对System.Windows.Forms程序集的引用,并使用其中的内容。我刚才测试了从WPF调用System.Windows.Forms.MessageBox.Show()
。可以正常工作。
System.Windows.Forms.MessageBox.Show("test", "caption", System.Windows.Forms.MessageBoxButtons.OKCancel, System.Windows.Forms.MessageBoxIcon.Error);
你可以在WPF中简单地使用winforms枚举,或者编写一个将WPF枚举转换为winforms枚举的包装器。