当你点击Owner window时,它在Child window下方,那么在WPF中是否可能让Owner window处于Child window之上?
以下是我调用Child window的示例:
Window2 window = new Window2();
window.Owner = this;
window.Show();
父/所有者窗口将始终位于子窗口下方。
当你点击Owner window时,它在Child window下方,那么在WPF中是否可能让Owner window处于Child window之上?
以下是我调用Child window的示例:
Window2 window = new Window2();
window.Owner = this;
window.Show();
父/所有者窗口将始终位于子窗口下方。
System.Windows.Application
中的一些或所有(非-MainWindow
)窗口的Window.Owner
属性设置为null。虽然这是一个简单易行的解决方法,确实可以独立解决Window
重叠问题,但不幸的是,它也抑制了许多有用的应用程序级功能,在以下领域中,WPF似乎还想提供:
Application
的激活/停用(通过鼠标单击、桌面Alt-Tab切换等方式),Application.ShutdownMode
属性,以及通常情况下,Application
。可以通过将一个特殊的不可见窗口实例指定为Application.MainWindow
来解决Window
重叠问题,同时仍保留这些系统范围的WPF功能。
修改应用程序,使其创建的第一个Window
(分配给Application.MainWindow
的Window
)是一个特殊的虚拟Window
,然后通过将其Visibility
设置为Visibility.Hidden
或调用Window.Hide()
来使其不可见。这不会隐藏它所拥有的窗口。然后,确保您想要的包含真实内容的“主”窗口以及所有其他窗口都由此不可见窗口拥有。
一旦隐藏,虚拟Window
将不会显示在Windows 10任务栏中。您可以在任何需要模拟特殊指定的可见窗口上设置Window.ShowInTaskbar
属性,如有必要。
这种方法允许您的Application
中的任何可见窗口位于其他窗口的顶部,同时仍保留WPF功能和系统级应用程序激活行为。例如,当Application
被激活(通过单击任何一个窗口或通过Alt-tab),所有应用程序的窗口都会在任何其他桌面应用程序窗口之上一起出现,同时仍保留最近的“应用内”Z顺序。 WPF关闭功能也得到保留,包括正确观察根据关闭不可见MainWindow
(或所有其他窗口)的Application.ShutdownMode
逻辑。
我遇到了类似的情况。我解决这个问题的方法是在显示窗口后简单地移除所有者。
Window2 window = new Window2();
window.Owner = this;
window.Show();
window.Owner = null;
编辑: 有人回复了这个问题,当我看到它时,决定编写一个扩展方法。
public static void ShowAsIfChildOf(this Window childWindow, Window parentWindow)
{
childWindow.Owner = parentWindow;
childWindow.Show();
childWindow.Owner = null;
}
Window2 window = new Window2();
window.Owner = this;
window.Show();
window.Owner = null;
在我看来,似乎与...相同
Window2 window = new Window2();
window.Show();
不要为子窗口设置Owner,然后在MainWindow中处理OnClosing事件,像这样:
private void MainWindow_OnClosing(object? sender, CancelEventArgs e)
{
foreach (var window in Application.Current.Windows)
{
if (window is Window appWindow)
{
if(appWindow.Equals(Application.Current.MainWindow))
continue;
appWindow.Close();
}
}
}