Обратитесь к активному окну в WPF? - PullRequest
51 голосов
/ 11 января 2010

Как я могу сослаться на активное окно приложения WPF в C #, используя что-то вроде свойства ActiveForm в WinForms?

Ответы [ 4 ]

89 голосов
/ 11 января 2010

Один из возможных способов - это просмотреть список открытых окон в приложении и проверить, какое из них имеет IsActive = true:

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

Не уверен, что может быть более одного активного окна, еслиНапример, есть модальное диалоговое окно, показывающее, в этом случае владелец диалогового окна и само диалоговое окно могут быть активными.

22 голосов
/ 17 октября 2012

Есть лучший способ сделать это, используя PInvoke. Ответ Aviads не работает постоянно (есть некоторые крайние случаи с диалогами).

IntPtr active = GetActiveWindow();

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

Сначала необходимо включить следующий импорт:

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
0 голосов
/ 20 июля 2017

Я знаю, что это немного старый вопрос, но я думаю, что мой ответ может кому-то помочь.

Моя проблема заключалась в следующем: у меня было приложение WPF MVVM, и мне нужно было получить мой экземпляр MainWindow во втором представлении, т.е. модели второго представления, чтобы установить видимость кнопки строки заголовка на visible.

Это мое решение:

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

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 17 декабря 2016

У меня проблемы с этим способом "Application.Current.Windows.OfType (). SingleOrDefault (x => x.IsActive);" особенно потому, что я строил приложение с главным окном, тогда у меня были проблемы, когда было выбрано главное окно. Я разрешаю это, создав это:

В каком-то базовом классе или App.xaml.cs создайте это:

       public static Window ActivatedWindow {get;set;}

Затем поместите в свой базовый класс производное Окно или все события активации вашего Окна:

Первый вариант - Базовый класс персонального окна:

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

Второй вариант - в активированном событии Windows:

   private void XWindow_Activated(object sender,EventArgs e)
    {
     App.ActivatedWindow= this;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...