C# 是否参考WPF中的活动窗口?
如何在C#中使用类似WinForms中ActiveForm属性的内容引用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
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;