请参阅WPF中的活动窗口?

时间:2010-01-10 22:17:49

标签: c# wpf window

如何使用WinForms中的ActiveForm属性引用C#中的活动Window of WPF应用程序?

5 个答案:

答案 0 :(得分:89)

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

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

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

答案 1 :(得分:22)

使用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();

答案 2 :(得分:0)

我遇到问题“Application.Current.Windows.OfType()。SingleOrDefault(x =&gt; x.IsActive);”特别是因为我正在使用主窗口构建应用程序,然后在选择主窗口时出现问题。我决定创建它:

在某些基类或App.xaml.cs中创建:

       public static Window ActivatedWindow {get;set;}

然后输入您的基类派生窗口或所有Window的激活事件:

第一个选项 - 个人窗口基类:

       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;
    }

答案 3 :(得分:0)

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

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

这是我的解决方案:

visible

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

答案 4 :(得分:0)

accepted answer 有效,但我在 Visual Studio 中调试时遇到了一个可能值得一提的边缘情况。

代码:

var activeWindow = Application.Current?.Windows.OfType<Window>().FirstOrDefault(w => w.IsActive);

if (window != null)
{
    window.Owner = activeWindow;
    window.DataContext = viewModel;
}

我注意到,当我在另一个类中有一个断点,并按 F5 到达上述代码中的断点时,返回的 activeWindow 为空,不知何故这导致我的对话框窗口消失了。

>

这可以通过以下解决方法解决:

#if DEBUG
    if (activeWindow == null)
    {
        activeWindow = Application.Current?.MainWindow;
        // Or just force Topmost = true
    }
#endif

至少我可以确保在调试时可以看到弹出窗口。

我进行了更多的反复试验,发现当对话框窗口具有以下属性时会出现此问题:ShowInTaskbar="False"。当我将其设置为 true 时,即使所有者为空,对话框也会出现。

另一种解决方法是设置 Topmost="True",然后我也可以保留我的 ShowInTaskbar 属性。

我不知道发生了什么,但如果有人对此有更多见解,将不胜感激。