2012-05-31 24 views
8

Se creo una classe derivata da System.Windows.Window e la mostro con ShowDialog, viene visualizzata sopra la finestra principale come previsto e la finestra principale è disabilitata. Tuttavia è possibile posizionare entrambe le finestre dietro ad altre applicazioni, quindi ripristinare la finestra principale. Questo lascia solo una singola finestra che sembra essersi arrestata in modo anomalo e può creare confusione.Come posso impedire che una finestra di dialogo venga nascosta

È possibile assicurarsi che la finestra di dialogo sia sempre visualizzata se viene visualizzata la finestra principale? La finestra di dialogo MessageBox.Show non ha tali problemi

Aggiornamento:

una finestra di test viene definito come

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

e chiamato con

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

Usi form method :: ShowDialog (IWin32Window)? La finestra di dialogo con la finestra del proprietario dovrebbe comportarsi come previsto. –

+0

Non sto usando Forms, è System.Windows.Window e ShowDialog non prende alcun parametro –

risposta

7

è necessario impostare la proprietà Proprietario.

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

Uso 'PopupWindowAction' nella mia applicazione WPF. L'impostazione di _owner_ nella finestra principale _corrente_ era la chiave per ottenere il comportamento descritto che conosciamo da _Windows MessageBox_. (Grazie, ho cercato per un'ora ...!) – RamNow

1

Per garantire che la finestra di dialogo viene sempre visualizzato se viene visualizzata la finestra principale, aggiungi il gestore all'evento modificato di visibilità della maschera principale per impostare TopMost t rue o falso al form figlio in base alla visibilità principale

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; 
    } 
} 

Aggiornamento

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

L'ultima cura che posso pensare è quello di utilizzare un timer con user32 dll GetForegroundWindow per verificare se la forma principale è visibile.

+0

Sto usando System.Windows.Window non un Form, e che non ha una proprietà di eventi VisibleChanged. Scusa per non averlo chiarito –

+0

Spiacente, non riesco a trovare System.Windows.Window in dot net 3.5, in ogni caso se riesci a trovare la proprietà Window.Visible, quindi prova a sovrascriverla, quindi il mio 'MainFrmVisibleChanged' usa il set della proprietà Visible controllare l'aggiornamento lì –

+1

I dettagli sono disponibili all'indirizzo http://msdn.microsoft.com/en-us/library/system.windows.window.aspx Grazie per i suggerimenti, ma le impostazioni del proprietario risolvono il problema per il mio caso. –

1

Questo codice dovrebbe funzionare come si desidera

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

Lo fa, grazie, ma l'impostazione del proprietario è un po 'più semplice –

Problemi correlati