在WinForms和WPF中都可以使用的抽象MessageBox结果?

16 浏览
0 Comments

在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中都能工作的单个方法,因为我有使用这个库中其他代码的项目,所以必须包含它。

admin 更改状态以发布 2023年5月22日
0
0 Comments

如果你不再积极地维护这个库,或者这个库本身不太可能在未来发生太多变化,那么请将其翻译为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枚举的包装器。

0