2010-11-23 90 views
4

我正在構建一個應用程序,該應用程序顯示某個操作的模態對話框。該模式對話框使用Form構建,並具有作爲Owner的主應用程序窗口,該窗口作爲Form.ShowDialog方法中的參數傳遞。直到按下alt鍵纔會顯示模態常用對話框

當單擊按鈕時,該模式對話框需要產生一個通用對話框(FontDialog)。常見對話框也顯示爲模式窗口。

所以 「所有者層次」 是(A - > B表示A 「擁有」 B) MainApp - > ModalDialog - > FontDialog類

好了,問題是FontDialog類不顯示呢除非我按下ALT鍵。應用程序的行爲幾乎和預期的一樣,即當我調用FontDialog.ShowDialog()時,我無法將焦點設置到MainApp窗口和ModalDialog,但FontDialog只是「不可見」,直到我按下ALT鍵鍵)然後出現。

任何人都知道爲什麼會發生這種情況?我嘗試將FormDialog的Owner設置爲null(因此使用Desktop作爲所有者窗口),但它的行爲方式錯誤。

在此先感謝。

一些代碼 公共類SnapshotDialogView:表 {/// 唧唧歪歪

 /// 
     /// Button click handler 
     private void btnChangeFont_Click(object sender, EventArgs e) 
     { 
      // this.Owner == MainAppWindow 
      DialogResult result = fontDialog.ShowDialog(this); 

      if (DialogResult.Cancel == result) 
       return; 

      Presenter.ChangeLabelsFont(fontDialog.Font); 
     } 
} 

啊,是的,還有一兩件事。如果我在調用FontDialog.ShowDialog()之前隱藏了ModalDialogForm(代碼中的SnapshotDialogView),字體對話框顯示ok。

+0

你能發佈一些代碼的這個真聲音不正常, – 2010-11-23 21:41:14

+0

代碼是非常正常的,但這裏有雲 – 2010-11-23 22:22:59

+0

好吧,它是「解決」,如果我在調用fontDialog.ShowDialog(this)之前隱藏ModalForm,但我不知道是什麼原因造成的這個。 :( – 2010-11-23 23:10:44

回答

0

嘗試使用模式窗體爲您FontDialog的所有者:

yourFontDialog.ShowDialog(yourModalForm); 
1

這裏是你描述的場景的一個最基本的例子。

using System; 
using System.Drawing; 
using System.Windows.Forms; 

public class MainAppForm : Form 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainAppForm()); 
    } 
    public MainAppForm() 
    { 
     Text = "MainAppForm"; 
     Controls.Add(new Button { Text = "Show ModalDialog", AutoSize = true, Location = new Point(10, 10) }); 
     Controls[0].Click += (s, e) => 
      { 
       using (ModalDialog dlg = new ModalDialog()) 
        dlg.ShowDialog(this); 
      }; 
    } 
} 

public class ModalDialog : Form 
{ 
    public ModalDialog() 
    { 
     Text = "ModalDialog"; 
     Controls.Add(new Button { Text = "Show FontDialog", AutoSize = true, Location = new Point(10, 10) }); 
     Controls[0].Click += (s, e) => 
     { 
      using (FontDialog dlg = new FontDialog()) 
       dlg.ShowDialog(this); 
     }; 
    } 
} 

它沒有表現出您描述的行爲。這意味着你的代碼中有些東西存在錯誤。

我的建議是開始刪除所有代碼,直到問題消失。這應該讓你知道問題是什麼。

或者,您可以從上述程序開始,並開始添加代碼,直到問題出現。

4

我有一個類似的問題,使用MessageBox.Show()
經過一些閱讀/測試,我發現這是一個副作用,用我的一個組件覆蓋onPaint()。我猜測它會在主框架失去焦點時錯過刷新或什麼東西,因爲任何會導致重新繪製的東西都會使MessageBox顯示出來。

我快速的解決方案是設置組件Visible = false中所示的對話框之前,它設置爲true後:

private void btn_Click(object sender, EventArgs e) 
    { 
     Grid.Visible = false; 
     MessageBox.Show("asdf"); 
     Grid.Visible = true; 
    } 

我不知道,如果你發現了一個不同的解決方案已經因爲這是一個幾個月大。如果你確實對我發現的內容感到好奇。

編輯:我剛剛閱讀您的評論,它看起來像我們發現類似的解決方案。

1

我不習慣在.NET中編寫代碼,但我遇到了類似的問題,我的win32(純C++)代碼和MessageBox()函數。 我誤以爲我沒有在WM_PAINT處理函數中對BeginPaint()和EndPaint()函數對進行繪圖。只要我添加了這兩個函數,並在他們之間完成我的繪圖代碼,問題就消失了。雖然我不知道如何可以在.NET環境:(做不

0

我有同樣的問題,在VBNet在MessageBox。

好像窗戶儘管這最頂端的窗口是不實際一個通過調用BringToFront(),它解決了問題MessageBox.show前右:?。

Me.BringToFront() 
MessageBox.Show("blablabla", Me.Text, 
       MessageBoxButtons.YesNo, 
       MessageBoxIcon.Question)