2012-05-31 20 views
8

Wenn ich eine von System.Windows.Window abgeleitete Klasse erzeuge und sie mit ShowDialog zeige, erscheint sie wie erwartet über dem Hauptfenster und das Hauptfenster ist deaktiviert. Es ist jedoch möglich, beide Fenster hinter anderen Anwendungen zu platzieren und dann einfach das Hauptfenster zurück zu bringen. Dies lässt nur ein einziges Fenster zurück, das scheinbar abgestürzt ist und kann verwirrend sein.Wie kann ich verhindern, dass ein Dialogfenster ausgeblendet wird

Kann sichergestellt werden, dass das Dialogfenster immer angezeigt wird, wenn das Hauptfenster angezeigt wird? Der MessageBox.Show Dialog hat keine solchen Probleme

Update:

Ein Test Dialog wird als

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

und

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

verwenden Sie Formular :: Showdialog (IWin32Window) Methode? Der Dialog mit dem Eigentümerfenster sollte sich wie erwartet verhalten. –

+0

Ich verwende keine Formulare, es ist ein System.Windows.Window, und ShowDialog nimmt keine Parameter –

Antwort

7

müssen Sie die Owner-Eigenschaft festlegen.

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

Ich benutze 'PopupWindowAction' in meiner WPF-Anwendung. Den _owner_ auf das _current main window_ zu setzen, war der Schlüssel, um das beschriebene Verhalten von _Windows MessageBox_ zu erhalten. (Danke, ich habe eine Stunde gesucht ...!) – RamNow

1

Um sicherzustellen, dass das Dialogfenster wird immer angezeigt, wenn das Hauptfenster angezeigt wird, fügen Sie den Handler zum Hauptformular Sichtbarkeit geändertem Ereignis hinzu, um TopMost t zu setzen rue oder falsch Kind Form nach Haupt Sichtbarkeit

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

aktualisieren

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

Die letzte Heilung i denken kann, ist ein Timer mit user32 dll GetForegroundWindow zu verwenden, um zu überprüfen, ob Haupt-Form sichtbar ist.

+0

Ich benutze System.Windows.Window kein Formular, und das hat keine VisibleChanged-Ereignisse-Eigenschaft. Tut mir leid, dass ich das nicht klar mache. –

+0

Sorry, ich finde System.Windows.Window in dot net 3.5 nicht, wenn Sie die Window.Visible-Eigenschaft finden, also versuchen Sie, sie zu überschreiben, stattdessen verwenden meine 'MainFrmVisibleChanged' den Satz der Visible-Eigenschaft check update up da –

+1

Details sind unter http://msdn.microsoft.com/en-us/library/system.windows.window.aspx Danke für die Vorschläge, aber Einstellungen der Besitzer löst das Problem für meinen Fall. –

1

Dieser Code sollte funktionieren, wie Sie

wollen
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

Es tut, danke, aber die Einstellung des Besitzers ist ein bisschen einfacher –

Verwandte Themen