2017-05-25 39 views
-1

我在现有的应用程序中有一堆消息框,既有简单的用户信息,也有问题。如何“拦截”消息框并修改其内容,并恢复正常流程?

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

修改函数是一种翻译,但为了演示的目的,可以说这个特殊函数的内容为+ =“AAA”,顶部标题为+ =“BBB”。

注1:搜索时,我看到了几个自定义消息框,但 这些都是额外的控制,主要用于改变按钮标题 或风格,不为“拦截”。请改正。

注2:完全同意,一个更好的&清洁MVVM结构本来可以避免上述所需的 伎俩,但这个大的应用程序前就开始了一段时间,有一个 非常小,不同的目的

+0

“-1”作者会如此善意地解释为什么负面吗?也许这个问题不在他/她的专业水平? – fab

回答

0

假设代码使用了使用文本和标题参数的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类),然后重建解决方案才有效。

+0

这与MessageBox.Show();的每个实例有何不同,并直接更改该字符串? OP将不得不通过它们来完成这项工作。 – stybl

+0

如果您的应用程序位于名称空间X下,并且您的MessageBox类也位于名称空间X下,则所有现有的源代码行(如MessageBox.Show(“...”,“...”)将通过您的类路由,而不是调用System.Windows.MessageBox。 (我刚刚测试过。)所以你不需要更新现有代码中的其他任何东西。 当然,这个假设你可以从源代码重建应用程序。 –

+0

它还假定OP想要为每个MessageBox添加完全相同的文本,这可能不是这种情况,因为他们说它的意思是翻译。 – stybl

1

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

按照documentation

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

这意味着你不能做类似如下:

var box = new MessageBox([stuff]); 

MS特意做了这个类的构造函数或构造私人(或保护),让你使用工厂方法代替(MessageBox.Show();) 。请注意,由于它们是明确定义的,只是不可访问,这意味着也不会生成隐式构造函数。

这样做也是不行:它关闭后

var box = MessageBox.Show([stuff]); 

Show方法不返回到打开盒子本身的引用,但对DialogResult对象。

至于你的情况,我能想到解决你的问题的唯一方法是通过程序去改变字符串,或者创建一个新的自定义控件并完全抛弃MessageBox。您可能能够找到另一种方式,但是“拦截”MessageBox实例是不可能的。

+0

是不是可能就在它打开之前?或通过重新设计/完成正常的messagebox.show? – fab

+0

在这种情况下,您可能需要修改传递给它的字符串。它不会拦截它,它首先以您想要的方式创建它。清楚的是,我们假设“就在它打开之前”意味着在你调用MessageBox.Show();之前。您无法调用它,然后在显示实际框并在其中修改文本之前立即停止其执行。 – stybl

+0

不,你说得对,当它打开之前,它确实是在通话之后(否则我会用完全其他的Windows功能替代,但我现在有太多这样的) – fab

相关问题