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;
}
또 다른 방법은 네이티브를 사용하는 것입니다.GetActiveWindow
user32.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
'programing' 카테고리의 다른 글
복잡한 Git 분기 이름으로 모든 Git 명령이 중단되었습니다. (0) | 2023.05.17 |
---|---|
Excel-VBA에서 SQL 데이터베이스 액세스 (0) | 2023.05.17 |
특정 리비전으로 이동 (0) | 2023.05.17 |
여러 줄의 JSON으로 컬 (0) | 2023.05.17 |
새로 추가된 파일을 포함하여 모든 파일을 단일 명령으로 스테이징하고 커밋하려면 어떻게 해야 합니까? (0) | 2023.05.17 |