2012-05-31 26 views
8

Si creo una clase derivada de System.Windows.Window y la muestro con ShowDialog, aparece sobre la ventana principal como se esperaba, y la ventana principal está deshabilitada. Sin embargo, es posible poner ambas ventanas detrás de otras aplicaciones, y luego simplemente devolver la ventana principal. Esto simplemente deja una sola ventana que parece haberse bloqueado y puede ser confusa.¿Cómo puedo evitar que una ventana de diálogo se oculte?

¿Es posible garantizar que la ventana de diálogo siempre se muestre si se muestra la ventana principal? El diálogo MessageBox.Show no tiene tales problemas

Actualización:

un diálogo de ensayo se define como

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

y llamó usando

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

¿Utiliza el método Forma :: ShowDialog (IWin32Window)? El cuadro de diálogo con ventana de propietario debe comportarse como espera. –

+0

No estoy utilizando Formularios, es System.Windows.Window y ShowDialog no toma ningún parámetro –

Respuesta

7

tiene que establecer la propiedad del Propietario.

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

Estoy usando 'PopupWindowAction' en mi aplicación WPF. Configurar el _owner_ a _current main window_ fue la clave para obtener el comportamiento descrito que conocemos de _Windows MessageBox_. (¡Gracias, he buscado por una hora ...!) – RamNow

1

Para asegurarse de que la ventana de diálogo siempre se muestra si se muestra la ventana principal, agregue el controlador al evento de visibilidad de formulario principal cambiado para establecer TopMost t rue o falsa a la forma de niño de acuerdo con la visibilidad principal

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

actualización

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

El último cura que se me ocurre es utilizar un temporizador con GetForegroundWindow user32 DLL para comprobar si forma principal es visible.

+0

Estoy usando System.Windows.Window no es un Formulario y no tiene una propiedad de eventos VisibleChanged. Perdón por no dejar eso en claro –

+0

Lo siento, no puedo encontrar System.Windows.Window en dot net 3.5, de ninguna manera, si puedes encontrar la propiedad Window.Visible, así que trata de sobreescribirlo, así que en mi 'MainFrmVisibleChanged' usa el conjunto de propiedades visibles compruebe la actualización hasta allí –

+1

Los detalles están en http://msdn.microsoft.com/en-us/library/system.windows.window.aspx Gracias por las sugerencias, pero la configuración del propietario resuelve el problema para mi caso. –

1

Este código debe trabajar como desee

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

Sí, gracias, pero configurar al propietario es un poco más simple –

Cuestiones relacionadas