2012-05-31 114 views
8

如果我創建一個派生自System.Windows.Window的類並使用ShowDialog顯示它,它將按預期顯示在主窗口上方,並且禁用主窗口。 但是,可以將兩個窗口放在其他應用程序的後面,然後將主窗口放回。這隻剩下一個似乎已經崩潰的窗口,並且可能令人困惑。如何阻止對話窗口隱藏

如果顯示主窗口,是否可以確保始終顯示對話窗口?該MessageBox.Show對話框中有沒有這樣的問題

更新:

測試對話被定義爲

public partial class MyDialog : Window 
{ 
    public MyDialog() 
    { 
     InitializeComponent(); 
    } 
} 

,並使用

MyDialog d = new MyDialog(); 
    d.ShowDialog(); 
+0

你使用表格::的ShowDialog(IWin32Window)方法?所有者窗口的對話框應該按照您的預期行事。 –

+0

我沒有使用窗體,它的System.Windows.Window和ShowDialog沒有使用任何參數 –

回答

7

您必須設置所有者屬性。

MyDialog d = new MyDialog(); 
d.Owner = Application.Current.MainWindow;//or your owning window 
d.ShowDialog(); 
+0

我在我的WPF應用程序中使用'PopupWindowAction'。將_owner_設置爲_current主窗口_是獲得我們從_Windows MessageBox_中所瞭解的描述行爲的關鍵。 (謝謝,我已經搜索了一個小時......) – RamNow

1

調用,以確保對話窗口總是顯示主窗口如果顯示,添加處理程序到主窗體可見性更改事件設置TopMost t根據主知名度

ChildForm frmDLg = null; 
public MainForm() 
{ 
    this.VisibleChanged += MainFrmVisibleChanged; 
} 

private void LoadDialogForm() 
{ 
    try { 
     if (frmDLg == null || frmDLg.IsDisposed) { 
      frmDLg = new ChildForm(); 
     } 
     frmDLg.ShowDialog(); 
    } catch (Exception ex) { 
     //Handle exception 
    } 
} 

private void MainFrmVisibleChanged(object sender, System.EventArgs e) 
{ 
    if (frmDLg != null && !frmDLg.IsDisposed) { 
     frmDLg.TopMost = this.Visible; 
    } 
} 

更新

public override bool Visible 
     { 
      get 
      { 
       return base.Text; 
      } 
      set 
      { 
       base.Text = value; 
       // Insert my code 
       if (frmDLg != null && !frmDLg.IsDisposed) 
       { 
        frmDLg.TopMost = this.Visible; 
       } 
      } 
     } 

最後治癒我能想到的是使用具有USER32 DLL getforegroundwindow定時器來檢查,如果主要形式是可見的街還是假子窗體。

+0

我使用System.Windows.Window而不是窗體,並且沒有VisibleChanged事件屬性。對不起,不明確 –

+0

對不起,我無法找到網點3.5中的System.Windows.Window,任何方式,如果你可以找到Window.Visible屬性,所以嘗試重寫它,所以相反,我的'MainFrmVisibleChanged'使用一套Visible屬性檢查更新有 –

+1

詳細信息在http://msdn.microsoft.com/en-us/library/system.windows.window.aspx 感謝您的建議,但設置所有者解決我的情況下的問題。 –

1

此代碼應該工作,只要你想

public MainWindow() 
    { 
     InitializeComponent(); 

     this.Activated += new EventHandler(MainWindow_Activated); 
    } 

    void MainWindow_Activated(object sender, EventArgs e) 
    { 
     if (m == null) 
      return; 

     m.Activate(); 
    } 


    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     m = new MyDialog(); 
     m.ShowDialog(); 
    } 
    MyDialog m; 
+0

它的確如此,謝謝,但設置所有者更簡單一些 –