다음을 통해 공유


.NET 9용 WPF의 새로운 기능

이 문서에서는 .NET 9용 WPF(Windows Presentation Foundation)의 새로운 기능들을 설명합니다. 올해 WPF의 주요 초점은 WPF의 시각적 기능을 개선하고 Windows 11의 Fluent 디자인 원칙에 따라 새로운 테마를 제공하는 것이었습니다.

Microsoft Store에서 WPF 갤러리 앱을 다운로드하여 새 테마를 미리 볼 수 있습니다.

Fluent 테마

WPF 앱에 대한 최신 Windows 11 미학을 제공하는 새로운 테마가 WPF에 포함되어 있습니다. 통합 조명 및 어둡게 모드와 시스템 테마 컬러 지원이 포함됩니다.

  • 조명 모드의 흐름 테마:

    조명 모드에서 흐름 테마를 보여 준 WPF 갤러리 앱의 스크린샷.

  • 어둡게 모드의 흐름 테마:

    어두운 모드에서 흐름 테마를 보여주는 WPF 갤러리 앱의 스크린샷

테마 적용

속성을 설정 ThemeMode 하거나 Fluent 테마 리소스 사전을 참조하는 두 가지 방법으로 Fluent 테마를 적용할 수 있습니다. 테마 모드 설정에 대한 자세한 내용은 ThemeMode를 참조하세요.

Fluent 테마 리소스 사전은 다음 팩 URI /PresentationFramework.Fluent;component/Themes/Fluent.xaml에서 사용할 수 있습니다. 애플리케이션 수준에서 리소스를 적용하려면 리소스를 앱의 리소스에 로드합니다.

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

리소스 사전은 창 자체에만 테마에 Window 적용할 수도 있습니다.

ThemeMode

속성을 통해 노출되는 WPF에 새 스타일 API가 ThemeMode 추가되었습니다. 이 속성을 사용하면 스타일 지정 리소스 사전을 직접 참조하지 않고도 Fluent 스타일을 적용할 수 있습니다.

사용 가능한 값은 다음과 같습니다.

  • Light- 밝은 Fluent 테마를 적용합니다.
  • Dark- 어두운 Fluent 테마를 적용합니다.
  • System— 사용자의 현재 Windows 설정에 따라 밝은 또는 어두운 Fluent 테마를 적용합니다.
  • None-(기본값) Aero2 테마를 사용합니다.

전체 애플리케이션에 테마 모드를 적용하려면 형식에서 ThemeMode 속성을 Application 설정합니다. 단일 창에 적용하려면 형식을 ThemeMode 설정합니다Window.

예를 들어 Windows에서 설정한 현재 조명 또는 어두운 테마에 따라 전체 애플리케이션의 스타일을 지정합니다.

<Application x:Class="MyWpfProject.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MyWpfProject"
             StartupUri="MainWindow.xaml"
             ThemeMode="System">

다음은 Windows에서 설정한 테마에 관계없이 밝은 테마를 강제 설정하는 예입니다.

<Window x:Class="MyWpfProject.LightWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyWpfProject"
        Title="LightWindow" Height="450" Width="800"
        ThemeMode="Light">

ThemeMode 애플리케이션 수준이 아닌 None 값으로 설정된 경우 더 이상 창 수준에서 None 적용할 수 없습니다.

ThemeMode 는 Fluent 사전에 의해 설정된 설정을 준수하도록 설계되어 Fluent 테마를 사용자 지정할 수 있도록 합니다.

코드에서 설정

코드에서 ThemeMode 설정을 변경하는 지원은 현재 실험적 기능입니다. 코드에서 속성에 ThemeMode 액세스하면 오류 WPF0001 생성되어 API에 대한 액세스가 차단됩니다. API에 액세스하는 오류를 표시하지 않습니다.

Warning

이 API는 실험적이며 변경될 수 있습니다.

먼저 다음 PropertyGroup 요소를 프로젝트 파일에 추가하여 오류를 표시하지 않습니다.

<PropertyGroup>
    <NoWarn>$(NoWarn);WPF0001</NoWarn>
</PropertyGroup>

지시문을 #pragma warning disable WPF0001 사용하여 전체 프로젝트에 대해 사용하지 않도록 설정하는 대신 오류가 발생하는 위치를 표시하지 않을 수 있습니다.

다음으로, 애플리케이션 수준 또는 창 수준에서 속성을 설정합니다 ThemeMode .

// Set light mode at the application-level
Application.Current.ThemeMode = ThemeMode.Light;

// Set dark mode on the current window
this.ThemeMode = ThemeMode.Dark;

Windows 테마 컬러 지원

Windows 10에서는 개인 터치를 제공하거나 특정 시각적 요소를 호출하는 데 사용되는 사용자가 선택할 수 있는 악센트 색을 도입했습니다. 이제 WPF는 사용자가 선택한 강조색을 지원합니다.

시각적 색은 , System.Windows.Media.Color또는 System.Windows.Media.SolidColorBrush.로 System.Windows.ResourceKey사용할 수 있습니다. 색상 자체와 함께 강조색의 밝고 어두운 색조를 사용할 수 있습니다. 다음을 통해 System.Windows.SystemColors액세스합니다.

색 리소스 키 Brush 브러시 리소스 키
악센트 AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
밝게 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
밝게 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
밝게 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
어둡게 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
어둡게 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
어둡게 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Important

강조색은 Fluent 테마를 사용하거나 사용하지 않고 사용할 수 있습니다.

강조색을 사용하는 UI를 만들 때 리소스 키를 동적 리소스에 래핑합니다. 앱이 열리는 동안 사용자가 강조 색을 변경하면 앱에서 색이 자동으로 업데이트됩니다. 예를 들어 다음은 TextBlock 사용자가 선택한 테마 컬러로 설정된 전경색입니다.

<TextBlock Text="First Name:"
           Foreground="{DynamicResource {x:Static SystemColors.AccentColorBrushKey}}" />

하이픈 기반 합자 지원

WPF는 와 같은 TextBlockUI 컨트롤에서 하이픈 기반 합자를 지원한 적이 없습니다. 이 오랜 커뮤니티 요청은 .NET 9에 추가되었습니다.

.NET 8의 문자 모양에 적용되지 않는 합자의 이미지는 다음과 같습니다.

문자 모양이 .NET 8과 합자로 결합되지 않는 방법을 보여 주는 텍스트 블록이 있는 간단한 WPF 앱의 스크린샷

이제 .NET 9에서 렌더링된 것과 동일한 텍스트가 표시됩니다.

문자 모양이 .NET 9와 합자로 결합되는 방법을 보여 주는 텍스트 블록이 있는 간단한 WPF 앱의 스크린샷

BinaryFormatter가 더 이상 지원되지 않음

BinaryFormatter 은 역직렬화 공격에 취약하여 DoS(서비스 거부), 정보 공개 또는 원격 코드 실행으로 이어질 수 있으므로 안전하지 않은 것으로 간주됩니다. 역직렬화 취약성이 잘 이해되기 전에 구현되었으며 디자인은 최신 보안 모범 사례를 따르지 않습니다.

.NET 9부터 이러한 보안 위험을 방지하기 위해 구현이 제거되었습니다. 사용되는 경우 BinaryFormatter 예외가 PlatformNotSupportedException throw됩니다.

WPF는 클립보드 및 끌어서 놓기 작업에 대한 데이터를 직렬화하는 경우와 같은 많은 시나리오에서 사용됩니다 BinaryFormatter . 내부적으로 WPF는 알려진 형식 집합으로 특정 사용 사례를 처리하기 위해 더 안전한 하위 집합 BinaryFormatter 을 계속 사용합니다.

자세한 BinaryFormatter내용은 BinaryFormatter에 대한 WPF 마이그레이션 가이드를 참조 하세요.