2017-06-28 2 views
1

Wie maximiere ich und bringe ein WPF-Hauptfenster an die Vorderseite meines Desktops? Ich habe einen Dateiwächter, der ein Verzeichnis überwacht. Wenn eine neue Datei in dem Verzeichnis erstellt wird, möchte ich das Hauptfenster meiner WPF-Anwendungen an die Front des Dekstops bringen. Wie Sie sehen können, habe ich mehrere Methoden auf der Hauptversion ausprobiert.Wie kann ich das WPF-Hauptfenster nach vorne bringen?

Modified Code: (ich die folgende Fehlermeldung erhalten: „Der aufrufende Thread dieses Objekt nicht zugreifen, da ein anderer Thread besitzt es“)

DispatcherOperation o = Dispatcher.CurrentDispatcher.BeginInvoke(new 
Action(delegate 
     { 

      var win = System.Windows.Application.Current.MainWindow; 
      win.Activate(); 
      win.WindowState = System.Windows.WindowState.Normal; 
      win.Topmost = true; 
      win.Focus(); 


     }), System.Windows.Threading.DispatcherPriority.ContextIdle, null); 

     Debug.WriteLine("Invoke"); 

     o.Wait(); 

Modified 2 (Versucht, den Dispatcher des Hauptfensters zu bekommen. ich bekomme immer noch "‚der rufende Thread dieses Objekt nicht zugreifen, da ein anderer Thread es besitzt‘.

System.Windows.Application.Current.MainWindow.Dispatcher.Invoke(() => 
    { 
     var win = System.Windows.Application.Current.MainWindow; 
     win.Activate(); 
     win.WindowState = System.Windows.WindowState.Normal; 
     win.Topmost = true; 
     win.Focus(); 
    }, DispatcherPriority.Normal); 

UPDATE (Working) ich glaube, ich nicht rief der Disponent gebunden th Das Hauptfenster mit den obigen Beispielen. Am Ende habe ich in der Fensterklasse eine Variable namens _mainWindow vom Typ MainWindow erstellt. Im MainWindow-Konstruktor habe ich die Variable instanziiert: _mainwidow = this;

Dann übergebe ich die _mainwindow Variable im Konstruktor der Klasse, in der ich den FileWatcher verwende. Hier kann ich den Dispatcher der _mainwindow Variable zugreifen:

 _mainWindow.Dispatcher.Invoke(() => 
     { 
      var win = System.Windows.Application.Current.MainWindow; 
      win.Activate(); 
      win.WindowState = System.Windows.WindowState.Normal; 
      win.Topmost = true; 
      win.Focus(); 
     }, DispatcherPriority.Normal); 
+0

Does [diese] (https://stackoverflow.com/a/4831839/23074) Antwort Hilfe? –

+0

Funktioniert es, wenn Sie den "Dispatcher" des Hauptfensters anstelle des aktuellen verwenden? – Streamline

+0

Streamline, ich habe versucht, den Dispatcher des Hauptfensters zu bekommen, indem ich meinen Code ändere. Siehe Modifiziert 2 oben. Ich bekomme immer noch "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, weil ein anderer Thread es besitzt". –

Antwort

1

Versuchen Sie diesen Code

Dispatcher.Invoke(() => 
      { 
       this.Activate(); 
       this.WindowState = System.Windows.WindowState.Normal; 
       this.Topmost = true; 
       this.Focus(); 
      }); 
+0

Ich verwende Dispatcher.CurrentDispatcher.BeginInvoke, wie es scheint, Dispatcher.Invoke ist nicht verfügbar in. Net 4.6. Auch "das" funktioniert bei meiner Methode nicht, also habe ich mir einen Verweis auf das MainWindow genommen. Ich bekomme jetzt den folgenden Fehler, wenn ich versuche, einen Verweis auf das Fenster zu erhalten: "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da ein anderer Thread es besitzt" Siehe meinen modifizierten Code oben. –

Verwandte Themen