programing

WPF의 활성 창을 참조하시겠습니까?

skycolor 2023. 5. 17. 22:38
반응형

WPF의 활성 창을 참조하시겠습니까?

WinForms의 ActiveForm 속성과 같은 것을 사용하여 C#에서 WPF 응용 프로그램의 활성 창을 어떻게 참조할 수 있습니까?

한 가지 가능한 방법은 응용프로그램에서 열려 있는 창 목록을 스캔하고 창 목록 중 어떤 창이 있는지 확인하는 것입니다.IsActive = true:

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

예를 들어 대화 상자의 소유자와 대화 상자 자체가 활성화될 수 있는 모달 대화 상자가 있는 경우 둘 이상의 활성 창이 있을 수 있는지 확실하지 않습니다.

핀보케를 사용하여 이 작업을 수행하는 더 좋은 방법이 있습니다.비아이드 응답이 항상 작동하지는 않습니다(대화 상자가 있는 경우도 있습니다).

IntPtr active = GetActiveWindow();

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

먼저 다음 가져오기를 포함해야 합니다.

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

저는 이것이 좀 오래된 질문이라는 것을 알지만 제 대답이 누군가를 도울 수 있다고 생각합니다.

제 문제는 다음과 같습니다.WPF MVVM 애플리케이션을 사용하고 있었는데 이 애플리케이션을 사용해야 했습니다.MainWindow제목 표시줄 단추의 가시성을 설정하기 위해 두 번째 뷰, 즉 두 번째 뷰 모델의 인스턴스(instance)visible.

이것이 제 해결책입니다.

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

이것이 누군가에게 도움이 되기를 바랍니다.

"응용 프로그램" 방식에 문제가 있습니다.현재의.창문들.유형().SingleOrDefault(x = > x).IsActive);" 메인 창을 사용하여 응용 프로그램을 빌드하던 중 메인 창을 선택할 때 문제가 발생했습니다.다음을 생성하여 해결합니다.

일부 기본 클래스 또는 App.xaml.cs 에서 다음을 만듭니다.

       public static Window ActivatedWindow {get;set;}

그런 다음 Window 또는 Window의 Activate Event를 파생하는 기본 클래스를 입력합니다.

첫 번째 옵션 - 개인 창 기본 클래스:

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

두 번째 옵션 - Windows의 In Activated 이벤트:

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

또 다른 방법은 네이티브를 사용하는 것입니다.GetActiveWindowuser32.dll의 함수입니다.

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetActiveWindow();

실제 WPF 창으로 변환하기

IntPtr handle = GetActiveWindow();

HwndSource hwndSource = HwndSource.FromHwnd(handle);
var window = hwndSource?.RootVisual as Window;

WinForms 앱에서 WPF Window를 호스팅하는 경우,WindowInteropHelper사용해야 합니다.예를 들어 창 소유자가 올바르게 작동합니다.

var wih = new WindowInteropHelper(window)
{
    Owner = GetActiveWindow()
};

Visual Studio 업데이트 후 접하게 된 엣지 케이스가 없어져서 예전 답변을 편집했는데 답변 내역에서 확인할 수 있습니다.디버깅하는 동안 특정 상황에서 활성 창에 대해 null을 얻는 문제가 발생했습니다.

언급URL : https://stackoverflow.com/questions/2038879/refer-to-active-window-in-wpf

반응형