2017-05-25 63 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