3

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 に追加しても問題は解決しません。これは、2 番目のケースでは両方のウィンドウがアクティブになっているためです。また、セカンダリ ウィンドウをクリックしても、メイン ウィンドウは非アクティブになりません。これを実現するには、(すでにアクティブ化されている)メイン ウィンドウとセカンダリ ウィンドウをもう一度クリックする必要があります。

これを回避するにはどうすればよいですか (どちらの場合もセカンダリ ウィンドウのみをアクティブにする必要があります)。

4

2 に答える 2

1

CodeProject は実際にこの問題に対処しています ここ、これがあなたが探しているものであることを願っています.

Tamil Khason からの投稿と組み合わせると、理論的には、グローバル レベルで OnFocus イベントをオーバーライドできるため、ウィンドウがフォーカスされるたびに、それが「メイン ウィンドウ」になり、ALT + TAB のターゲットになります。

于 2013-05-21T15:10:06.710 に答える
0

THISソリューションに基づいて、次のコードはおそらく(テストされていないジェット)もトリックを行うことができます

  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);
                }
            }
于 2013-05-28T14:38:39.157 に答える