【问题标题】:C# wpf multiple windows on task barC# wpf任务栏上的多个窗口
【发布时间】:2018-02-02 03:51:14
【问题描述】:

我创建了一个有多个窗口的 C# 项目。当我做一些其他事情时,一些窗口失去了焦点。然后我必须通过一个一个点击任务栏将它们带到前面。

我想知道 C# wpf 窗口上是否有 OnTaskBarClick 事件?

然后我需要做的就是将所有子窗口设置为“ShowInTaskbar="False"”。然后,当我在任务栏上单击我的主窗口时,我会将所有窗口都放在前面。

【问题讨论】:

    标签: c# wpf taskbar


    【解决方案1】:

    您需要使用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");
    
            }
        }
    }
    

    【讨论】:

    • 这个我已经试过了。问题是我的主窗口在那里也有一些控制。当我在 mainwinodw 上单击某些东西时,Window.Activated 也被触发了。
    • 我还检查了发件人的类型。并且 EventArgs 没有包含任何来源或原始来源供我检查事件是否由任务栏触发
    【解决方案2】:

    我认为您遇到的是窗口 Owner 未在您的子窗口上设置。

    请参考Window.Owner Property

    当父窗口通过调用打开子窗口时 ShowDialog,两者之间建立了隐式关系 父窗口和子窗口。这种关系强制执行某些行为, 包括最小化、最大化和恢复。

    -

    当父窗口调用 Show 创建子窗口时, 但是,子窗口与父窗口没有关系 窗户。这意味着:

    • 子窗口没有对父窗口的引用。

    • 子窗口的行为不依赖于父窗口的行为;任何一个窗口都可以覆盖另一个,或者 最小化、最大化和独立恢复。

    在调用Show()ShowDialog() 之前,您可以通过在子窗口中设置Owner 属性轻松解决此问题

    Window ownedWindow = new Window();
    ownedWindow.Owner = this; // this being the main or parent window
    ownedWindow.Show();
    

    注意:如果符合 MVVM 模式,这可能会变得有点 比较麻烦,但是有很多关于如何链接所有者和父窗口的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多