programing

WPF 창이 닫혔는지 어떻게 알 수 있습니까?

skycolor 2023. 6. 6. 08:08
반응형

WPF 창이 닫혔는지 어떻게 알 수 있습니까?

저는 사용자가 닫거나 자동으로 닫히는 일부 하위 창을 표시하는 응용 프로그램을 만들고 있습니다.몇 가지 예외를 디버깅하는 동안 다음과 같은 메서드를 호출하려고 했습니다.Hide()이미 닫힌 창에서 이 특정 코드 분기는 두 경우 모두에 공통적이었고 나는 이것을 알아차리지 못했습니다.

제 첫 번째 아이디어 중 하나는 부동산을 찾는 것이었습니다.Window창문이 닫혔다는 것을 의미합니다찾을 수 없을 것 같습니다.WinForms에서는 IsDisposed 속성에서 양식이 닫혔음을 나타내는 다소 신뢰할 수 있는 표시기를 찾습니다(대화 상자에서는 안정적으로 작동하지 않지만 대화 상자에서는 작동하지 않습니다).이와 동등한 것은 아무것도 보이지 않습니다.Window다음에 대한 설명서Window.Close()메소드에 의해 변경된 속성을 나타내지 않는 것 같습니다.내가 명백한 것을 놓쳤나요, 아니면 창이 닫혔는지 알 수 있는 유일한 방법인가요?Closed이벤트? 간단한 작업에 대한 까다로운 요구사항인 것 같습니다.

MSDN WPF 포럼의 이 대화(마지막 게시물 참조)에 따르면 IsLoaded가 false인지 확인할 수 있습니다. 이는 창에서 콘텐츠를 "다운로드할 자격이" 있음을 의미합니다.그것이 당신에게 효과가 있기를 바랍니다!

Window 클래스에서 파생된 경우 다음 작업을 수행할 수 있습니다.

public bool IsClosed { get; private set; }

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);
    IsClosed = true;
}

비공개 이벤트에 등록하는 것보다 이점이 있습니다. 콜백 등록을 취소할 필요가 없습니다.

이것이 당신에게 유용하기를 바랍니다.

발표소스.FromVisual(창) == null;

제 해결책은 대화 상자에 이벤트를 간단히 첨부하는 것이었습니다.Closed이벤트:

MikesDialog dlg = new MikesDialog();
dlg.Closed += delegate
{
    //  The user has closed our dialog.
    validationgDlg = null;
};

//  ...elsewhere in the code...

if (validationgDlg != null)
{
     //  Our "MikesDialog" is still open...
     . . .
}

또 다른 방법은 애플리케이션입니다.Windows에는 열려 있는 창 목록이 있습니다.이 컬렉션에 창이 포함되어 있는지 확인할 수 있습니다(닫힌 후 제거됨).

당신이 전화해야 할 것 같습니다.OfType<Window>()왜냐하면 그것은 전문적인 컬렉션이기 때문입니다.

IsDisposed 속성이 내부 속성인 이유는 모르겠지만, 반사를 두려워하지 않는다면:

var window = new Window();
var propertyInfo = typeof(Window).GetProperty("IsDisposed", BindingFlags.NonPublic | BindingFlags.Instance);
var isDisposed = (bool)propertyInfo.GetValue(window);

즉, 반영은 더 이상 클래스의 공용 API에 의해 보호되지 않기 때문에 과도하게 사용되지 않습니다.해당 경로를 사용할 경우 최소 단위 테스트를 사용해야 합니다.

WindowClass에 정적이 아닌 속성을 추가할 수 있습니다.bool IsClosed 리고진정합다니에 합니다.Closed 이벤트:

public partial class MyWindow : Window
{
    public bool IsClosed { get; set; } = false;
    public MyWindow()
    {
        Closed += MyWindow_Closed;
        InitializeComponent();
    }
}    

private void MyWindow_Closed(object sender, EventArgs e)
{
   IsClosed = true;
}

에 따라 경에따확인라를 합니다.Application.Current.MainWindow.IsActive합니다.

언급URL : https://stackoverflow.com/questions/381973/how-do-you-tell-if-a-wpf-window-is-closed

반응형