如何“拦截”消息框&修改其内容,并恢复正常流程?

时间:2017-05-25 10:43:19

标签: c# wpf

我在现有应用程序中有一堆消息框,既有用户的简单信息,也有问题。

我想“拦截”它们(肯定不是正确的IT措辞),自动更改其内容,然后通常将其显示给用户。 应该将“OK”或其他标准返回值返回/转发到初始消息框。

修改功能是一种翻译,但为了演示,我们可以说这个特殊功能对内容做+ =“AAA”,对顶部标题做+ =“BBB”。

  

注1:在搜索时,我看到了几个自定义消息框,但是   这些是附加控件,主要用于更改按钮标题   或风格,而不是“拦截”。请更正。

     注意2:完全同意更好的&更清洁的MVVM结构可以避免   上面需要的技巧,但这个大应用程序开始前一段时间了   非常小而且目标不同

2 个答案:

答案 0 :(得分:1)

据我所知,这是不可能的。您不能引用MessageBox,因此一旦打开它就无法以任何方式访问它。

根据documentation

  

您无法创建MessageBox类的新实例。要显示消息框,请调用静态方法MessageBox.Show。

这意味着您不能执行以下操作:

MessageBox.Show();

MS故意使该类的构造函数或构造函数为private(或protected),以使您使用工厂方法(var box = MessageBox.Show([stuff]); )。请注意,由于它们是显式定义的,只是不可访问,这意味着也不会生成隐式构造函数。

这样做也不会起作用:

Show

$image = '<img src="data:image/jpeg;base64,'.base64_encode($data['photo1']).'" height="100" width="100"/>'; $var = "<div>".$image."</div>"; echo $var; 方法不会返回对打开框本身的引用,但会在关闭后返回DialogResult对象。

至于你的情况,我能想到解决你的问题的唯一方法是要么通过程序并更改字符串,要么创建一个新的自定义控件并完全抛弃MessageBox。你可能能够找到另一种方式,但是&#34;拦截&#34;消息框实例是不可能的。

答案 1 :(得分:0)

假设代码使用带有text和caption参数的System.Windows.MessageBox.Show调用,您可以尝试在应用程序的公共命名空间中定义公共静态MessageBox类,提供类似的Show方法来更新参数并调用原始的MessageBox.Show方法,例如:

public static class MessageBox
{
    public static void Show(string text, string caption)
    {
        text += "AAA";
        caption += "BBB";
        System.Windows.MessageBox.Show(text, caption);
    }
}

注意:这只有在您能够从源代码重建解决方案时才有效,因为它需要添加新的源代码文件(自定义MessageBox类),然后重建解决方案。