wake-up-neo.com

Siehe aktives Fenster in WPF?

Wie kann ich in C # auf ein aktives Windows-Fenster der WPF-Anwendung verweisen, das in ActiveForm-Eigenschaften in WinForms verwendet wird?

49
pkain

Eine Möglichkeit wäre, die Liste der geöffneten Fenster in der Anwendung zu scannen und zu prüfen, welches Fenster IsActive = true hat:

Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

Nicht sicher, ob möglicherweise mehr als ein Fenster aktiv ist, wenn beispielsweise ein modales Dialogfeld angezeigt wird. In diesem Fall sind möglicherweise der Eigentümer des Dialogfelds und das Dialogfeld selbst aktiv.

87
Aviad P.

Es gibt einen besseren Weg, dies mit PInvoke zu tun. Die Antwort von Aviads funktioniert nicht immer (es gibt einige Edge-Fälle mit Dialogen).

IntPtr active = GetActiveWindow();

ActiveWindow = Application.Current.Windows.OfType<Window>()
    .SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);

Man muss zunächst folgenden Import einschließen:

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
22
ghord

Ich habe Probleme mit diesem Weg "Application.Current.Windows.OfType (). SingleOrDefault (x => x.IsActive);" Speziell weil ich eine Anwendung mit einem Hauptfenster baute, hatte ich Probleme, als das Hauptfenster ausgewählt wurde. Ich löse es so:

In einer Basisklasse oder in App.xaml.cs erstellen Sie Folgendes:

       public static Window ActivatedWindow {get;set;}

Fügen Sie dann in Ihre Basisklasse das Ableitungsfenster oder das gesamte Activate-Ereignis Ihres Fensters ein:

Erste Option - persönliche Fenster-Basisklasse:

       public class MetroToolWindowBase
       {
         public MetroToolWindowBase()
         {   
            Activated += new EventHandler(MakeActive); 
         }   
         private void MakeActive(object sender, EventArgs e)
         {
        App.ActivatedWindow= this;
         }
       }

Zweite Option - In aktiviertem Ereignis von Windows:

   private void XWindow_Activated(object sender,EventArgs e)
    {
     App.ActivatedWindow= this;
    }
0
Richard Aguirre

Ich weiß, das ist eine etwas alte Frage, aber ich denke, meine Antwort könnte jemandem helfen.

Mein Problem war folgendes: Ich hatte eine WPF-MVVM-Anwendung und musste meine MainWindow-Instanz in der zweiten Ansicht aufrufen, d. H. Im zweiten Ansichtsmodell, um die Sichtbarkeit der Titelleistenschaltfläche auf visible einzustellen.

Das ist meine Lösung:

MainWindow window = (MyApp.MainWindow)App.Current.MainWindow;
window.btnSearch.Visibility = System.Windows.Visibility.Visible;

Hoffe das würde jemandem helfen.

0
NutCracker