WPF 윈도우 객체의 활성화(Show) 상태 확인 방법?

안녕하세요. :smile:

WPF 윈도우 객체의 활성화(Show) 상태를 체크하는 방법에 대해 알아보고 있습니다.

일단 설명을 드리면, 창을 닫은 경우에만 인스턴스를 생성하고 활성(Show)하는 로직입니다.

처음에는 DialogResult로 하면 되겠다 싶었는데요.

if (win is null || win.DialogResult != null)
{
    win = new ExplorerWindow();
    win.Show();
}
win.Init(Data);

근데 문제는 이미 창을 닫은 시점(Closing 또는 Closed)에서는
DialogResult를 변경할 수가 없더라고요.

(아직 창을 닫는 로직에 대한 계획이 없을 때 일단 Closing에서 처리해보고자… 시도)

private void Closing(object sender, CancelEventArgs e)
{
    // 에러 (종료되는 시점에서는 변경 불가)
    DialogResult = false or true;
}

(생각이라는 것을 해보니 당연한거였네요…? ㅎㅎ) :wink:


그래서 일단은 아래와 같이 처리했습니다.

if (win is null || !win.IsVisible)
{
    win = new ExplorerWindow();
    win.Show();
}
win.Init(Data);

IsVisible 속성을 통해 당장 처리하긴 했는데요.
지금과 같은 상황에서 IsVisible을 사용해도 문제가 없을까요?

이 부분은 정확히 알고 사용해야 할 것 같아서 질문을 드려봅니다!

  • DialogResult를 통해 해야한다.
  • 새로운 변수, 로직을 만들어 정확하게 처리한다.
  • IsVisible 속성을 사용해도 문제 없다.
  • 그 밖에 방법!

읽어주셔서 감사합니다.

2 Likes

윈도가 닫힌 속성이 있으면 좋으련만 없는것 같네요;

가장 일반적인 방법은,

    public partial class ExplorerWindow : Window
    {
        public bool IsClosed { get; private set; }

        public ExplorerWindow()
        {
            InitializeComponent();
        }

        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            IsClosed = true;

OnClosed()에서 속성값을 바꿔줘서,

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (win == null || win.IsClosed == true)
            {
                win = new ExplorerWindow();
                win.Show();
            }
        }

이렇게 사용하는 방식이 있겠고요,

구글링을 해보니 다음의 정보들이 나옵니다.

PresentationSource.FromVisual(win) == null

win이 Closed 되었으면, PresentationSource도 얻을 수 없으므로 동일한 동작을 하게 됩니다.

Application.Current.Windows.Cast<Window>().Contains(win) == false

win이 Closed 되었으면, Application.Current.Windows 목록에서 제거될 것이므로 동일한 동작을 하게 됩니다.

4 Likes

혹시 win.IsActive로는 알 수 없을까요…?

1 Like

@level120 앗 감사합니다. :smile:

확인해봤는데 IsActive는 다른 창에서 확인할 때에는 무조건 값이 false로 변경이 되네요. :disappointed_relieved:

이 글을 다시 읽어보니 Window.Show() 이후 창을 닫았을 때 새로운 다른 Window를 Show()하고 싶으신 것 같아요.

이건 첫 Window의 Closed 이벤트를 사용해서 새 인스턴스를 만들면 될 것 같아요.

그런데 DialogResult에 값을 왜 할당하고 싶은지는 제가 파악하지 못했지만 이건 ShowDialog()를 위한 속성이기 때문에 고려하지 않아야 합니다.

코드로 작성해보려 하니 일반적인 상황이 아니라 그런지 조금 어렵네요. 저는 이 경우에 사용자 정의 컨트롤로 만들어서 관리하는 것도 좋다고 봅니다.
아마 두 개의 창을 관리하는 VM이 있으면 편하겠네요. :slight_smile:

1 Like

@level120 좋은 설명 감사드립니다!!