web-dev-qa-db-fra.com

Reportez-vous à la fenêtre active dans WPF?

Comment puis-je faire référence à une fenêtre active d'application WPF en C #, en utilisant quelque chose comme la propriété ActiveForm dans WinForms?

49
pkain

Une solution possible serait d’analyser la liste des fenêtres ouvertes dans l’application et de vérifier laquelle d’entre elles a IsActive = true:

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

Je ne sais pas s'il peut y avoir plus d'une fenêtre active si, par exemple, une boîte de dialogue modale s'affiche. Dans ce cas, le propriétaire de la boîte de dialogue et la boîte de dialogue elle-même peuvent être actifs.

87
Aviad P.

Il existe un meilleur moyen de faire cela en utilisant PInvoke. La réponse d'Aviads ne fonctionne pas tout le temps (il existe des cas Edge avec des boîtes de dialogue).

IntPtr active = GetActiveWindow();

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

Il faut d'abord inclure l'importation suivante:

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

J'ai des problèmes avec cette façon "Application.Current.Windows.OfType (). SingleOrDefault (x => x.IsActive);" parce que je construisais une application avec une fenêtre principale, j’ai eu des problèmes lorsque la fenêtre principale a été sélectionnée. Je le résous en créant ceci:

Dans certaines classes de base ou App.xaml.cs, créez ceci:

       public static Window ActivatedWindow {get;set;}

Ensuite, placez dans votre fenêtre de dérivation de classe de base ou tout l'événement d'activation de votre fenêtre:

Première option - Classe de base de fenêtre personnelle:

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

Deuxième option - dans l'événement activé de Windows:

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

Je sais que cette question est un peu ancienne mais je pense que ma réponse pourrait aider quelqu'un.

Mon problème était le suivant: j'avais une application WPF MVVM et je devais obtenir mon instance MainWindow dans la deuxième vue, c'est-à-dire le deuxième modèle de vue, afin de définir la visibilité du bouton de la barre de titre sur visible.

Ceci est ma solution:

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

J'espère que cela aiderait quelqu'un.

0
NutCracker