【问题标题】:ALT-TAB always activates main window in WPF app with multiple owned windowsALT-TAB 始终激活具有多个拥有窗口的 WPF 应用程序中的主窗口
【发布时间】:2013-05-21 12:59:19
【问题描述】:

在 Windows 7、.NET 4.0 上,我有一个问题可以通过将以下代码复制到 Visual Studio 生成的空白 WPF 应用程序中来重现:

    public MainWindow()
    {
        InitializeComponent();
        Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        new Window() { Title = "Test", ShowInTaskbar = false, Owner = this }.Show();
    }
  1. 运行应用程序
  2. 激活辅助窗口
  3. Alt-Tab 到其他正在运行的应用程序
  4. 使用鼠标在任务栏中激活我们的 WPF 应用程序

现在 WPF 应用程序再次处于活动状态,辅助窗口已激活,主窗口已停用,这是预期(和期望)的行为。

现在改为执行此操作(仅第 4 步不同):

  1. 运行应用程序
  2. 激活辅助窗口
  3. Alt-Tab 到其他正在运行的应用程序
  4. Alt-Tab 返回我们的 WPF 应用

WPF 应用程序再次处于活动状态,但现在主窗口已激活。 添加此代码

private void Application_Activated(object sender, EventArgs e)
{
    Windows[1].Activate();
}

到 App.xaml.cs 不能解决问题,因为现在在第二种情况下,两个窗口都被激活。此外,单击辅助窗口不会停用主窗口。我必须再次单击(已激活的)主窗口和辅助窗口才能实现此目的。

我怎样才能避免这种情况(在这两种情况下只有辅助窗口应该处于活动状态)?

【问题讨论】:

  • 您是否需要激活主窗口(即使没有聚焦)?如果没有,那么 ShowDialog() 而不是 Show() 应该适合你。
  • 是的,主窗口必须是独立的。这只是说明问题的一个最小示例,它将是一个更大的应用程序。我想消除这只是奇怪的行为。想象一下像 Visual Studio 之类的东西 - 如果我将一个文档浮出主窗口,然后按两次 Alt-Tab,则只有浮动窗口仍然被激活,而不是主窗口。如果主窗口处于活动状态,即使不应该处于活动状态,我也会在正确处理输入时遇到问题。

标签: wpf focus multi-window


【解决方案1】:

CodeProject 实际上解决了这个问题here,希望这就是你要找的。​​p>

post from Tamil Khason 结合使用,理论上您可以在全局级别覆盖 OnFocus 事件,这样每次窗口聚焦时,它都会成为“主窗口”,然后将成为 ALT+TAB 的目标。

【讨论】:

  • 不幸的是,我无法将其应用于我的案例,因为他正在谈论 ShowDialog()。但是,我找到了一种解决方法:如果我激活第二个窗口以响应 MainWindow_Activated 而不是 Application_Activated,我会得到所需的行为。我觉得之前没有尝试过这个有点愚蠢——当然我必须确保这个激活只发生在应用程序的直接激活之前,所以跟踪当前活动的窗口很重要。感谢您的回复。
【解决方案2】:

基于THIS 解决方案,以下代码可能(未经测试的jet)也可以解决问题

  protected override void OnStartup(StartupEventArgs e)
            {
                EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent, new RoutedEventHandler(WindowLoaded));

                base.OnStartup(e);
            }

    void WindowLoaded(object sender, RoutedEventArgs e)
            {
                Window w = sender as Window;
                if (w != null)
                {
                   // this part works in my case very well
                    w.Owner =Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多