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

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

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

높은 DPI 개선 사항

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

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

  • PerMonitorV2(으)로 설정되어 ApplicationHighDpiMode을(를) 실행하는 애플리케이션에 대한 현재 모니터 DPI 설정에 따라 Form.MaximumSizeForm.MinimumSize 속성을 스케일링합니다.

    .NET 7에서 이 기능은 기본적으로 사용하지 않도록 설정되며 이 변경 사항이 수신되도록 옵트인해야 합니다. .NET 8부터 이 기능은 기본적으로 사용하도록 설정되며 이전 동작을 되돌리기 위해 옵트아웃해야 합니다.

    기능을 사용하도록 설정하려면 runtimeconfig.json에서 configProperties 설정을 설정합니다.

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

접근성 향상 및 수정

이 릴리스는 다음 항목을 포함하지만 이에 국한되지 않는 접근성에 대한 추가 개선 사항을 추가합니다.

데이터 바인딩 개선 사항(미리 보기)

Windows Forms는 이미 강력한 바인딩 엔진을 가지고 있지만 WPF에서 제공하는 데이터 바인딩과 유사한 보다 현대적인 형태의 데이터 바인딩이 도입되고 있습니다.

새로운 데이터 바인딩 기능을 사용하면 이전보다 Windows Forms의 ViewModels에서 더 쉽게 MVVM 패턴과 개체 관계형 매퍼 사용을 완전히 사용할 수 있습니다. 이렇게 하면 코드 숨김 파일의 코드를 줄일 수 있으며 새로운 테스트 가능성이 열립니다. 더 중요하게는 Windows Forms와 WPF, UWP/WinUI 및 .NET MAUI와 같은 및 다른 .NET GUI 프레임워크 간에 코드 공유를 사용하도록 설정합니다. 그리고 일반적으로 묻는 질문을 명확히하기 위해 Windows Forms의 XAML을 도입할 계획이 없습니다.

이러한 새로운 데이터 바인딩 기능은 .NET 7에 대해 미리 보기로 제공되며 이 기능에 대한 추가 작업은 .NET 8에서 수행됩니다.

새 바인딩을 사용하도록 설정하려면 프로젝트 파일에 EnablePreviewFeatures 설정을 추가합니다. 이는 C# 및 Visual Basic 모두에서 지원됩니다.

<Project Sdk="Microsoft.NET.Sdk">

  <!-- other settings -->

  <PropertyGroup>
    <EnablePreviewFeatures>true</EnablePreviewFeatures>
  </PropertyGroup>

</Project>

다음 코드 조각은 Windows Forms에서 다양한 클래스에 추가된 새 속성, 이벤트 및 메서드를 보여줍니다. 다음 코드 예제는 C#에 있지만 Visual Basic에도 적용됩니다.

public class Control  {
    [BindableAttribute(true)]
    public virtual object DataContext { get; set; }
    [BrowsableAttribute(true)]
    public event EventHandler DataContextChanged;
    protected virtual void OnDataContextChanged(EventArgs e);
    protected virtual void OnParentDataContextChanged(EventArgs e);
}

[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
    protected BindableComponent();
    public BindingContext? BindingContext { get; set; }
    public ControlBindingsCollection DataBindings { get; }
    public event EventHandler BindingContextChanged;
    protected virtual void OnBindingContextChanged(EventArgs e);
}

public abstract class ButtonBase : Control {
    [BindableAttribute(true)]
    [RequiresPreviewFeaturesAttribute]
    public ICommand? Command { get; set; }
    [BindableAttribute(true)]
    public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandCanExecuteChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler? CommandParameterChanged;
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandCanExecuteChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandParameterChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnRequestCommandExecute(EventArgs e);
}

public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
    [BindableAttribute(true)]
    [RequiresPreviewFeaturesAttribute]
    public ICommand Command { get; set; }
    [BindableAttribute(true)]
    public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandCanExecuteChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandChanged;
    [RequiresPreviewFeaturesAttribute]
    public event EventHandler CommandParameterChanged;
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandCanExecuteChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnCommandParameterChanged(EventArgs e);
    [RequiresPreviewFeaturesAttribute]
    protected virtual void OnRequestCommandExecute(EventArgs e);
}

기타 개선 사항

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

  • 끌어서 놓기 처리는 Windows 끌어서 놓기 기능과 아이콘 및 텍스트 레이블과 같은 더 풍부한 디스플레이 효과와 일치합니다.
  • 폴더 및 파일 대화 상자에서 더 많은 옵션을 사용할 수 있습니다.
    • 최근 항목에 추가
    • 쓰기 액세스 확인
    • 확장 모드
    • 확인하려면 상호 작용해야 합니다.
    • 읽기 전용 선택
    • 숨겨진 파일 표시
    • 고정된 위치 표시
    • 미리 보기 표시
  • ErrorProvider에는 이제 HasErrors 속성이 있습니다.
  • 양식의 맞춤 레이아웃은 Windows 11용으로 고정됩니다.

추가 정보