programing

WPF의 활성 창을 참조하십시오.

coolbiz 2021. 1. 18. 08:13
반응형

WPF의 활성 창을 참조하십시오.


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


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

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

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


PInvoke를 사용하여이를 수행하는 더 좋은 방법이 있습니다. Aviads 답변이 항상 작동하지 않습니다 (대화 상자가있는 일부 경우가 있습니다).

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제목 표시 줄 단추의 가시성을 설정하려면 두 번째 뷰, 즉 두 번째 뷰 모델에서 인스턴스 를 가져와야 했습니다 visible.

이것이 내 해결책입니다.

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

이것이 누군가를 도울 수 있기를 바랍니다.


이 방법으로 문제가 있습니다 "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;
         }
       }

두 번째 옵션-Windows의 활성화 된 이벤트 :

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

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

반응형