안녕하세요.
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;
}
(생각이라는 것을 해보니 당연한거였네요…? ㅎㅎ)
그래서 일단은 아래와 같이 처리했습니다.
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 앗 감사합니다.
확인해봤는데 IsActive는 다른 창에서 확인할 때에는 무조건 값이 false로 변경이 되네요.
이 글을 다시 읽어보니 Window.Show() 이후 창을 닫았을 때 새로운 다른 Window를 Show()하고 싶으신 것 같아요.
이건 첫 Window의 Closed 이벤트를 사용해서 새 인스턴스를 만들면 될 것 같아요.
그런데 DialogResult에 값을 왜 할당하고 싶은지는 제가 파악하지 못했지만 이건 ShowDialog()를 위한 속성이기 때문에 고려하지 않아야 합니다.
코드로 작성해보려 하니 일반적인 상황이 아니라 그런지 조금 어렵네요. 저는 이 경우에 사용자 정의 컨트롤로 만들어서 관리하는 것도 좋다고 봅니다.
아마 두 개의 창을 관리하는 VM이 있으면 편하겠네요.
1 Like