2013-05-31 100 views
3

我正在創建一個顯示一些警報的應用程序。用MessageBox.Show它可以,但它對這個項目來說很醜。它的地鐵就像應用程序一樣,所以我們創建了一個類似Metro的MessageBox。暫停執行,如MessageBox或Dialog

我們的自定義MessageBox是一個網格,當我們需要它時,它會改變其可見性。 問題是,一個真正的MessageBox會停止執行util,用戶點擊它的「ok」。

那麼,我該如何模擬這種行爲呢?

+0

顯示另一個線程上的消息框 –

+1

'.ShowDialog()'...? –

+0

@ByteBlast爲什麼在另一個線程?請給我解釋一下。 –

回答

4

將您的自定義消息框設置爲表單。然後你可以打電話customMessageBoxFormInstance.ShowDialog() ..其中塊與消息框完全相同。

這是你會做什麼:

  • 創建一個類似於您的自定義MessageBox一種形式。也許你可以移動你的網格。
  • 把那裏有一個按鈕,它的DialogResult屬性設置爲OK
  • 使用此,無論你想你的警報顯示:

    if (customMessageBoxInstance.ShowDialog() == DialogResult.OK) { 
        // they clicked okay.. 
    } 
    

如你期望MessageBox做這將阻止正好..

+0

我想我不能。我正在使用MVVM和MVVM。 –

+2

你可以在'Window'上:http://msdn.microsoft.com/en-us/library/system.windows.window.showdialog.aspx –

1

您的自定義顯示需要阻止,直到單擊該按鈕,所以此僞代碼應該工作,但可能存在更好的解決方案。 MessageBox的用戶界面理想情況下運行在一個單獨的線程上,但Show將從您的主線程中調用。

void Show() 
{ 
    // set MessageBox visible 
    ... 

    // Wait until ok is pressed 
    while(!complete){ 
     Thread.sleep(100); 
    }; 

    complete = false; 
    return; 
} 

// onClick handler for the OK button 
void onClick() 
{ 
    complete = true; 
    // set message box invisible 
} 

private bool complete; 
0

我用MVVM一個DialogService - 你可以爲您的CustomMessagebox實現此功能。

var result = this.customMessageboxDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM); 

... do anything with the dialog result... 
1

這裏是我做了什麼:

<Grid> 
    <Grid x:Name="DialogOverlay"> 
    </Grid> 
    <Grid x:Name="ViewContainer"> 
    <Grid> 
</Grid> 

當顯示一個模式對話框,把它放在DialogOverlay,使覆蓋可見光和禁用ViewContainer電網。這可以防止用戶點擊/切換到常規用戶界面。

當對話框關閉時,應該隱藏這個對話框並啓用ViewContainer。

+0

+1 ..在完成工作的同時,它還允許訪問應用程序的其他部分,如果設計需要/允許的話,例如允許轉到不同的選項卡。 –

+0

是的,你可以在任何你喜歡的位置嵌套這個構造,這樣你就可以阻止正在更新/等待的那部分UI。 –