覆盖MessageBox.Show

时间:2013-11-18 23:52:51

标签: c# override messagebox citrix

我正在寻求覆盖System.Windows.Forms.MessageBox.Show()方法来保存修改单片代码库以使用新的消息框功能。

我正在使用Citrix Mobility SDK来检测传统的C#Windows应用程序,以便在iPad或Nexus平板电脑等移动设备上实现更直观的功能。

我希望在设备上显示本地消息框,为此,我需要使用MessageBox.Show函数替换应用程序中CustomMessageBox.Show的所有调用。代码库是巨大的,我宁愿不修改每个文件以使用CustomMessageBox.Show,因为这将是一个大而危险的工作,并导致SDK和应用程序之间的紧密耦合。

因此,有没有办法覆盖MessageBox.Show,以便我可以重新实现与第三方SDK一起使用的功能,因为它是最优雅的选项?

2 个答案:

答案 0 :(得分:2)

不,您无法覆盖MessageBox.Show,因为它是static方法。

答案 1 :(得分:2)

鉴于您无法覆盖MessageBox.Show,仍然有一个解决方案可以让它适用于移动和非移动案例。最简单的方法是创建一个具有模仿MessageBox.Show允许的成员的类。在此课程中,它了解移动设备是否处于活动状态。如果它不活动,则使用MessageBox.Show。否则它使用CustomMessageBox.Show。这是我在最近的一个示例中用于错误消息的示例成员函数。

/// <summary>
/// Show a error dialog box
/// </summary>
/// <param name="errorDialogText"></param>
public void ShowErrorDialog(String errorDialogText)
{
    if (!Visible || !IsMobile())
    {
        ErrorDialog.Show(errorDialogText);
    }
    else
    {
        ShowStatus(errorDialogText);
    }
}

ErrorDialog是MessageBox的包装类。请注意IsMobile()知道移动设备是否存在。

public class ErrorDialog
{
    //
    // When an exception happens, we show the message here
    //
    public static void Show(String text)
    {
        MessageBox.Show(text, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    //
    // When an exception happens, we show the message here
    //
    public static void Show(Exception ex)
    {
        MessageBox.Show(ex.GetType().ToString() + ":" + ex.Message + ex.Source, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        MessageBox.Show(ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

}

这只是抽象。通过创建新函数,您可以包装其他两个函数。在包装函数中,您可以决定调用哪一个。您仍然会更新所有MessageBox.Show引用的痛苦,但至少它将在您的控制之下,您可以在将来的任何时候出于任何原因更改抽象函数。

我的例子与你描述的完全不符。您可以在派生的Form类中创建函数,也可以创建一个对象并从该对象调用该函数。

我在Citrix的SDK上工作,很乐意提供帮助。 http://citrixblogger.org上有一些新帖子可能有助于解决其他问题。