C# 是否参考WPF中的活动窗口?

C# 是否参考WPF中的活动窗口?,c#,wpf,window,C#,Wpf,Window,如何在C#中使用类似WinForms中ActiveForm属性的内容引用WPF应用程序的活动窗口?一种可能的方法是扫描应用程序中打开的窗口列表,并检查其中哪个窗口具有IsActive=true: Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); Application.Current.Windows.OfType().SingleOrDefault(x=>x.IsAct

如何在C#中使用类似WinForms中ActiveForm属性的内容引用WPF应用程序的活动窗口?

一种可能的方法是扫描应用程序中打开的窗口列表,并检查其中哪个窗口具有
IsActive=true

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

不确定是否有多个活动窗口,例如,如果有一个模式对话框显示,在这种情况下,对话框的所有者和对话框本身可能处于活动状态。

有更好的方法使用PInvoke来实现这一点。Aviads answer并非始终有效(有一些带有对话框的边缘案例)


我对“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;
    }

我知道这是一个有点老的问题,但我认为我的回答可以帮助别人

我的问题是:我有一个WPF MVVM应用程序,我需要在第二个视图(即第二个视图模型)中获取我的
main窗口
实例,以便将标题栏按钮的可见性设置为
可见

这是我的解决方案:

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

希望这能对某人有所帮助。

再次查看我的旧答案,最好使用
of type()
操作符,而不是
Cast()
操作符,以防万一……太棒了!这使我不必向窗口传递引用,从而使我的数据结构不受UI引用的影响。谢谢为了使它更加健壮,您还可以使用
FirstOrDefault
而不是
SingleOrDefault
,如果有多个匹配项,它会引发异常。另外,它应该快一点,因为它接受第一个结果,并且不需要检查它是否是唯一的结果。有时
FirstOrDefault
SingleOrDefault
都返回
null
,这意味着没有IsActive为true的窗口。这怎么可能呢?如果应用程序本身没有激活呢?呵呵。我自己花了几个小时才发现这一点。事实上,我写的东西和你完全一样&来这里分享,但你是第一个,所以我投你一票:你能详细说明一下边缘案例是什么吗?@nchaud我使用的是AvalonDock,它允许你将工作区从主窗口拖到新窗口中。但是,这些窗口也被标记为
IsActive
。使用另一个解决方案引发了异常(
SingleOrDefault
throws,如果有多个匹配谓词),或者在使用
FirstOrDefault
   private void XWindow_Activated(object sender,EventArgs e)
    {
     App.ActivatedWindow= this;
    }
MainWindow window = (MyApp.MainWindow)App.Current.MainWindow;
window.btnSearch.Visibility = System.Windows.Visibility.Visible;