왜 Windows Form의 SizeApplicationSettings에 바인딩할 수 없는가?

Windows Forms를 다루는 개발자로서, 우리는 애플리케이션 상태를 유지하여 사용자 경험을 향상시키는 방법을 종종 모색합니다. ApplicationSettings와 Windows Forms를 사용할 때 자주 발생하는 질문 중 하나는: 왜 Windows Form의 크기를 직접 ApplicationSettings에 바인딩할 수 없는가? 입니다.

이러한 제한은 특히 다른 속성이 문제없이 바인딩될 때 실망감을 줄 수 있습니다. 그러나 이 문제를 해결하고 애플리케이션의 창 상태와 크기가 세션 간에 저장되도록 할 수 있는 방법이 있습니다. 문제의 본질을 탐구하고 해결책을 좀 더 명확하게 살펴보겠습니다.

제한 사항 이해하기

Windows Form의 크기를 ApplicationSettings에 직접 바인딩하려고 할 때, Size 속성이 속성 바인딩 목록에서 누락된 것을 볼 수 있습니다. 이는 폼의 크기를 단순히 바인딩할 수 없기 때문이며, 폼이 최대화되거나 축소될 때 상태를 저장할 필요성이 때문에 더 많은_context_(맥락)를 요구합니다.

명시적인 처리의 필요성

  • 상태 복원: 크기에 직접 바인딩하면 폼 상태(예: 최소화 또는 최대화 여부)의 가능한 변화가 반영되지 않습니다.
  • 추가 속성의 사용: 폼이 정상적인 상태에 없을 때, 크기는 RestoreBounds에서 가져와야 하며, 단순한 바인딩을 통해 업데이트되지 않습니다.

솔루션: RestorableForm 클래스 구현하기

이 제한 사항을 효과적으로 우회하기 위해, Form의 서브클래스를 생성할 수 있습니다—이를 RestorableForm이라고 부르겠습니다. 이 클래스는 애플리케이션의 창 크기와 상태를 원활하게 처리하며, 필요한 오버라이드와 바인딩을 구현합니다.

단계별 구현

  1. 표준 Form 대신 RestorableForm에서 상속받습니다.

  2. WindowRestoreState에 바인딩을 추가합니다.

    • 이 바인딩은 창의 위치와 상태를 캡처하고 저장합니다.
  3. 애플리케이션 종료 시 설정 저장을 호출합니다.

    • 창을 닫을 때 Properties.Settings.Default.Save()를 호출하여 모든 설정이 저장되도록 합니다.

예제 코드

RestorableForm 클래스의 간결한 구현 예제입니다:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace Utilities
{
    public class RestorableForm : Form, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private WindowRestoreStateInfo windowRestoreState;

        [Browsable(false)] 
        [SettingsBindable(true)] 
        public WindowRestoreStateInfo WindowRestoreState
        {
            get { return windowRestoreState; }
            set
            {
                windowRestoreState = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("WindowRestoreState"));
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            WindowRestoreState = new WindowRestoreStateInfo
            {
                Bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds,
                WindowState = WindowState
            };
            base.OnClosing(e);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (WindowRestoreState != null)
            {
                Bounds = ConstrainToScreen(WindowRestoreState.Bounds);
                WindowState = WindowRestoreState.WindowState;
            }
        }

        private Rectangle ConstrainToScreen(Rectangle bounds)
        {
            // 제약 로직을 여기에 추가합니다...
        }

        public class WindowRestoreStateInfo
        {
            public Rectangle Bounds { get; set; }
            public FormWindowState WindowState { get; set; }
        }
    }
}

코드의 주요 포인트

  • 속성 처리: WindowRestoreState 속성은 위치와 상태를 모두 캡처합니다.
  • 상태 로딩 및 저장: 오버라이드된 메서드는 닫을 때 위치 복원 및 창 상태를 처리합니다.
  • 화면 제약: ConstrainToScreen 메서드는 창이 표시 화면 내에서 적절하게 맞춰지도록 보장하며, 크기와 위치 복원 시 중요합니다.

추가 학습을 위한 참고 자료

RestorableForm 클래스에 사용된 구성 요소에 대한 더 많은 정보는 다음 링크에서 확인할 수 있습니다:

결론

Windows Form의 Size를 직접 ApplicationSettings에 바인딩하는 것은 도전 과제가 있긴 하지만, RestorableForm 클래스를 통해 애플리케이션이 세션 간의 상태를 기억하도록 보장할 수 있습니다. 명시적인 상태 처리를 구현함으로써 사용자가 애플리케이션을 사용할 때 보다 일관되고 개인화된 경험을 누릴 수 있도록 할 수 있습니다.

이 접근 방식을 통해 Windows Forms의 크기와 상태를 효과적으로 관리하고, 반응성이 뛰어나고 직관적인 사용자 친화적인 애플리케이션을 만들 수 있습니다.