如何使用WinForms中的ActiveForm属性引用C#中的活动Window of WPF应用程序?
答案 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 属性。
我不知道发生了什么,但如果有人对此有更多见解,将不胜感激。