.NET 8(Windows Forms .NET)의 새로운 기능

이 문서에서는 .NET 8의 새로운 Windows Forms 기능 및 향상된 기능을 설명합니다.

.NET Framework에서 .NET 8로 마이그레이션할 때 알아야 할 몇 가지 호환성이 손상되는 변경이 있습니다. 자세한 내용은 Windows Forms의 호환성이 손상되는 변경을 참조하세요.

데이터 바인딩 개선 사항

새 데이터 바인딩 엔진은 .NET 7에서 미리 보기로 제공되었고, 이제 .NET 8에서 완전하게 사용할 수 있습니다. 이 새 엔진은 기존 Windows Forms 데이터 바인딩 엔진만큼 광범위하지는 않지만, WPF를 기준으로 모델링되어 MVVM 디자인 원칙을 더 쉽게 구현할 수 있습니다.

향상된 데이터 바인딩 기능 덕분에 MVVM 패턴을 완전하게 활용하고 Windows Forms의 ViewModels에서 개체 관계형 매퍼를 사용하기가 더 쉬워졌습니다. 이로써 코드 숨김 파일의 코드 양이 줄어듭니다. 더 중요하게는 WPF, UWP/WinUI 및 MAUI와 같은 다른 .NET GUI 프레임워크와 Windows Forms 간에 코드를 공유할 수 있습니다. 앞에서 언급한 GUI 프레임워크는 XAML을 UI 기술로 사용하지만 Windows Forms에는 XAML이 제공되지 않는다는 점에 유의해야 합니다.

IBindableComponent 인터페이스와 BindableComponent 클래스는 새 바인딩 시스템을 구동합니다. Control은 인터페이스를 구현하고 Windows Forms에 새로운 데이터 바인딩 기능을 제공합니다.

단추 명령

단추 명령은 .NET 7에서 미리 보기로 제공되었고, 이제 .NET 8에서 완전하게 사용할 수 있습니다. WPF와 마찬가지로 ICommand 인터페이스를 구현하는 개체의 인스턴스를 단추의 Command 속성에 할당할 수 있습니다. 단추를 클릭하면 명령이 호출됩니다.

명령이 호출될 때 단추의 CommandParameter 속성 값을 지정하여 선택적 매개 변수를 제공할 수 있습니다.

CommandCommandParameter 속성은 다음 이미지와 같이 (DataBindings) 아래의 속성 창을 통해 디자이너에서 설정됩니다.

Windows Forms 단추의 명령 및 CommandParameter 속성을 강조 표시하는 Visual Studio 속성 창입니다.

또한 단추는 ICommand.CanExecuteChanged 이벤트를 수신 대기하며, 컨트롤이 ICommand.CanExecute 메서드를 쿼리하도록 만듭니다. 해당 메서드가 true를 반환하면 컨트롤이 활성화되고, false를 반환하면 컨트롤이 비활성화됩니다.

Visual Studio DPI 개선 사항

Visual Studio 2022 17.8에는 DPI를 인식하지 않는 디자이너 탭이 도입되었습니다. 이전에는 Visual Studio의 Windows 디자이너 탭이 Visual Studio의 DPI에서 실행되었습니다. 그 결과 DPI를 인식하지 않는 Windows Forms 앱을 디자인할 때는 문제가 발생합니다. 이제 DPI 인식 여부와 관계없이 앱을 실행하려 할 때와 동일한 규모로 디자이너가 실행되게 할 수 있습니다. 이 기능이 도입되기 전에는 DPI를 인식하지 않는 모드에서 Visual Studio를 실행해야 했기 때문에 Windows에서 크기 조정이 적용되면 Visual Studio 자체가 흐려졌습니다. 이제 Visual Studio는 그대로 둔 채 DPI를 인식하지 않는 디자이너를 실행할 수 있습니다.

프로젝트 파일에 <ForceDesignerDPIUnaware>를 추가하고 값을 true로 설정하여 Windows Forms 프로젝트에 DPI를 인식하지 않는 디자이너를 사용할 수 있습니다.

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>net8.0-windows</TargetFramework>
  <Nullable>enable</Nullable>
  <UseWindowsForms>true</UseWindowsForms>
  <ImplicitUsings>enable</ImplicitUsings>
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
  <ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode>
</PropertyGroup>

Important

Visual Studio는 프로젝트가 로드될 때 이 설정을 읽으며, 변경될 때는 읽지 않습니다. 이 설정을 변경한 후 프로젝트를 언로드하고 다시 로드하여 Visual Studio가 해당 설정을 준수하게 합니다.

높은 DPI 개선 사항

PerMonitorV2를 사용하는 높은 DPI 렌더링이 향상되었습니다.

  • 중첩된 컨트롤의 크기를 올바르게 조정합니다. 예를 들어 탭 페이지에 배치된 패널에 있는 버튼입니다.

  • 현재 모니터 DPI 설정에 따라 Form.MaximumSizeForm.MinimumSize 속성을 스케일링합니다.

    .NET 8부터 이 기능은 기본적으로 사용하도록 설정되며 이전 동작을 되돌리기 위해 옵트아웃해야 합니다.

    이 기능을 사용하지 않으려면 runtimeconfig.json에서 configProperties 설정에 System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi를 추가하고 값을 false로 설정합니다.

    {
      "runtimeOptions": {
        "tfm": "net8.0",
        "frameworks": [
            ...
        ],
        "configProperties": {
          "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false,
        }
      }
    }
    

기타 개선 사항

다음은 몇 가지 주목할 만한 변경 사항입니다.

  • FolderBrowserDialog를 처리하는 코드가 개선되어 몇 가지 메모리 누수 문제를 해결했습니다.
  • Windows Forms의 코드 베이스는 C# null 허용 여부를 천천히 활성화하여 잠재적인 null 참조 오류를 근절했습니다.
  • System.Drawing 소스 코드가 Windows Forms GitHub 리포지토리로 마이그레이션되었습니다.
  • 최신 Windows 아이콘에 새 API System.Drawing.SystemIcons.GetStockIcon으로 액세스할 수 있습니다. System.Drawing.StockIconId 열거형에 사용 가능한 모든 시스템 아이콘이 나열됩니다.
  • 이제 런타임에 더 많은 디자이너를 사용할 수 있습니다. 자세한 내용은 GitHub 문제 #4908을 참조하세요.