web-dev-qa-db-ja.com

WPFのアクティブウィンドウを参照しますか?

WinFormsのActiveFormプロパティなどを使用して、C#でWPFアプリケーションのアクティブウィンドウを参照するにはどうすればよいですか?

51
pkain

可能な方法の1つは、アプリケーションで開いているウィンドウのリストをスキャンし、どのウィンドウにIsActive = true

Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);

たとえば、モーダルダイアログが表示されている場合、複数のアクティブウィンドウがあるかどうかはわかりませんが、その場合、ダイアログの所有者とダイアログ自体がアクティブである可能性があります。

91
Aviad P.

PInvokeを使用してこれを行うより良い方法があります。 Aviadsの回答は常に機能しません(ダイアログを使用するEdgeのケースがいくつかあります)。

IntPtr active = GetActiveWindow();

ActiveWindow = Application.Current.Windows.OfType<Window>()
    .SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);

最初に次のインポートを含める必要があります。

[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
22
ghord

この方法で問題が発生しました "Application.Current.Windows.OfType()。SingleOrDefault(x => x.IsActive);"特に、メインウィンドウを使用してアプリケーションを構築していたため、メインウィンドウが選択されたときに問題が発生しました。これを作成して解決します:

いくつかの基本クラスまたはApp.xaml.csでこれを作成します。

       public static Window ActivatedWindow {get;set;}

次に、WindowまたはすべてのWindowのActivateイベントを派生する基本クラスに配置します。

最初のオプション-パーソナルウィンドウベースクラス:

       public class MetroToolWindowBase
       {
         public MetroToolWindowBase()
         {   
            Activated += new EventHandler(MakeActive); 
         }   
         private void MakeActive(object sender, EventArgs e)
         {
        App.ActivatedWindow= this;
         }
       }

2番目のオプション-Windowsのアクティブ化されたイベント:

   private void XWindow_Activated(object sender,EventArgs e)
    {
     App.ActivatedWindow= this;
    }
0
Richard Aguirre

これは少し古い質問ですが、私の答えが誰かを助けることができると思います。

私の問題はこれでした:WPF MVVMアプリケーションがあり、タイトルバーボタンの可視性をMainWindowに設定するために、2番目のビュー、つまり2番目のビューモデルでvisibleインスタンスを取得する必要がありました。

これは私の解決策です:

MainWindow window = (MyApp.MainWindow)App.Current.MainWindow;
window.btnSearch.Visibility = System.Windows.Visibility.Visible;

これが誰かを助けることを願っています。

0
NutCracker