【发布时间】:2018-02-02 03:51:14
【问题描述】:
我创建了一个有多个窗口的 C# 项目。当我做一些其他事情时,一些窗口失去了焦点。然后我必须通过一个一个点击任务栏将它们带到前面。
我想知道 C# wpf 窗口上是否有 OnTaskBarClick 事件?
然后我需要做的就是将所有子窗口设置为“ShowInTaskbar="False"”。然后,当我在任务栏上单击我的主窗口时,我会将所有窗口都放在前面。
【问题讨论】:
我创建了一个有多个窗口的 C# 项目。当我做一些其他事情时,一些窗口失去了焦点。然后我必须通过一个一个点击任务栏将它们带到前面。
我想知道 C# wpf 窗口上是否有 OnTaskBarClick 事件?
然后我需要做的就是将所有子窗口设置为“ShowInTaskbar="False"”。然后,当我在任务栏上单击我的主窗口时,我会将所有窗口都放在前面。
【问题讨论】:
您需要使用Window.Activated 事件来检测应用程序的窗口何时成为焦点:
来自文档:
一个窗口在以下情况下被激活(成为前景窗口):
首先打开窗口。
用户通过鼠标选择窗口、按 ALT+TAB 或从任务管理器切换到窗口。
用户单击窗口的任务栏按钮。
或者你可以使用Application.Activated事件。
点击一个已经处于活动状态的窗口的控件也可能导致Window.Activated 事件触发,所以如果问题是触发太频繁,您可能需要注意应用程序 em> 在活动和非活动之间切换。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Application.Current.Activated += CurrentOnActivated;
Application.Current.Deactivated += CurrentOnDeactivated;
}
private bool isDeactivated = true;
private void CurrentOnDeactivated(object sender, EventArgs eventArgs)
{
isDeactivated = true;
//handle case where another app gets focus
}
private void CurrentOnActivated(object sender, EventArgs eventArgs)
{
if (isDeactivated)
{
//Ok, this app was in the background but now is in the foreground,
isDeactivated = false;
//TODO: bring windows to forefont
MessageBox.Show("activated");
}
}
}
【讨论】:
我认为您遇到的是窗口 Owner 未在您的子窗口上设置。
当父窗口通过调用打开子窗口时 ShowDialog,两者之间建立了隐式关系 父窗口和子窗口。这种关系强制执行某些行为, 包括最小化、最大化和恢复。
-
当父窗口调用 Show 创建子窗口时, 但是,子窗口与父窗口没有关系 窗户。这意味着:
子窗口没有对父窗口的引用。
子窗口的行为不依赖于父窗口的行为;任何一个窗口都可以覆盖另一个,或者 最小化、最大化和独立恢复。
在调用Show() 或ShowDialog() 之前,您可以通过在子窗口中设置Owner 属性轻松解决此问题
Window ownedWindow = new Window();
ownedWindow.Owner = this; // this being the main or parent window
ownedWindow.Show();
注意:如果符合 MVVM 模式,这可能会变得有点 比较麻烦,但是有很多关于如何链接所有者和父窗口的资源。
【讨论】: