Udostępnij za pośrednictwem


Co nowego w WPF dla platformy .NET 9

W tym artykule opisano nowości w programie Windows Presentation Foundation (WPF) dla platformy .NET 9. Głównym obszarem zainteresowania dla WPF w tym roku było ulepszenie możliwości wizualnych WPF i zapewnienie nowego motywu opartego na zasadach projektowania Fluent dla systemu Windows 11.

Nowy motyw można wyświetlić w wersji zapoznawczej, pobierając aplikację Galeria WPF ze Sklepu Microsoft.

Motyw fluent

Nowy motyw jest dołączony do WPF, który zapewnia świeżą, nowoczesną estetykę systemu Windows 11 dla aplikacji WPF. Zawiera zintegrowane tryby światła i ciemności oraz obsługę kolorów akcentu systemu.

  • Motyw fluent w trybie jasnym:

    Zrzut ekranu aplikacji Galeria WPF przedstawiający płynny motyw w trybie jasnym.

  • Motyw fluent w trybie ciemnym:

    Zrzut ekranu aplikacji Galeria WPF przedstawiający płynny motyw w trybie ciemnym

Stosowanie motywu

Motyw Fluent można zastosować na dwa sposoby, ustawiając ThemeMode właściwość lub odwołując się do słownika zasobów motywu Fluent. Aby uzyskać więcej informacji na temat ustawienia trybu motywu, zobacz TematMode.

Słownik zasobów motywu Fluent jest dostępny pod następującym identyfikatorem URI pakietu: /PresentationFramework.Fluent;component/Themes/Fluent.xaml. Aby zastosować zasób na poziomie aplikacji, załaduj zasób do zasobów aplikacji:

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

Słownik zasobów można również zastosować do Window motywu tylko w samym oknie.

ThemeMode

Dodano nowy interfejs API stylów do platformy WPF, który jest udostępniany za pośrednictwem ThemeMode właściwości . Za pomocą tej właściwości można zastosować styl Fluent bez konieczności bezpośredniego odwołowania się do słownika zasobów stylów.

Dostępne wartości to:

  • Light— stosuje jasny motyw Fluent.
  • Dark— stosuje ciemny motyw Fluent.
  • System— stosuje jasny lub ciemny motyw Fluent na podstawie bieżącego ustawienia systemu Windows użytkownika.
  • None—(ustawienie domyślne) Używa motywu Aero2.

Aby zastosować tryb motywu dla całej aplikacji, ustaw ThemeMode właściwość typu Application . Aby zastosować go do pojedynczego okna, ustaw ThemeMode dla Window typu .

Na przykład styl całej aplikacji na podstawie bieżącego światła lub ciemnego motywu ustawionego przez system 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">

Oto przykład wymuszania motywu jasnego, niezależnie od motywu ustawionego przez 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 Jeśli parametr jest ustawiony na dowolną wartość inną niż None na poziomie aplikacji, None nie można go już zastosować na poziomie okna.

ThemeMode jest przeznaczony do przestrzegania ustawień ustawionych przez słownik Fluent, co pozwala dostosować motyw Fluent.

Ustaw w kodzie

Obsługa zmiany ustawienia ThemeMode w kodzie jest obecnie funkcją eksperymentalną. Uzyskiwanie ThemeMode dostępu do właściwości w kodzie generuje błąd WPF0001, uniemożliwiając dostęp do interfejsu API. Pomiń błąd, aby uzyskać dostęp do interfejsu API.

Ostrzeżenie

Ten interfejs API jest eksperymentalny i może ulec zmianie.

Najpierw dodaj następujący PropertyGroup element do pliku projektu, aby pominąć błąd:

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

Napiwek

Możesz użyć dyrektywy , #pragma warning disable WPF0001 aby pominąć błąd, w którym występuje, zamiast wyłączać go dla całego projektu.

Następnie ustaw ThemeMode właściwość na poziomie aplikacji lub na poziomie okna:

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

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

Obsługa koloru akcentu systemu Windows

System Windows 10 wprowadził wybrany przez użytkownika kolor akcentu, który jest używany w dostarczaniu osobistego dotyku lub wywoływaniu określonego elementu wizualnego. WPF obsługuje teraz wybrany przez użytkownika kolor wyróżniający.

Kolor wizualizacji jest dostępny jako System.Windows.Media.Color, System.Windows.Media.SolidColorBrushlub System.Windows.ResourceKey. Wraz z samym kolorem dostępne są jasne i ciemne odcienie koloru akcentu. Dostęp do nich można uzyskać za pośrednictwem usługi System.Windows.SystemColors:

Color Kolor klucza zasobu Pędzel Klucz zasobu pędzla
Akcent AccentColor AccentColorKey AccentColorBrush AccentColorBrushKey
Jasny 1 AccentColorLight1 AccentColorLight1Key AccentColorLight1Brush AccentColorLight1BrushKey
Jasny 2 AccentColorLight2 AccentColorLight2Key AccentColorLight2Brush AccentColorLight2BrushKey
Jasny 3 AccentColorLight3 AccentColorLight3Key AccentColorLight3Brush AccentColorLight3BrushKey
Ciemny 1 AccentColorDark1 AccentColorDark1Key AccentColorDark1Brush AccentColorDark1BrushKey
Ciemny 2 AccentColorDark2 AccentColorDark2Key AccentColorDark2Brush AccentColorDark2BrushKey
Ciemny 3 AccentColorDark3 AccentColorDark3Key AccentColorDark3Brush AccentColorDark3BrushKey

Ważne

Kolory wyróżniające są dostępne z motywem Fluent lub bez tego motywu.

Podczas tworzenia interfejsu użytkownika, który używa koloru akcentu, zawijaj klucz zasobu w zasobie dynamicznym. Gdy użytkownik zmieni kolor akcentu podczas otwierania aplikacji, kolor zostanie automatycznie zaktualizowany w aplikacji. Na przykład poniżej przedstawiono TextBlock kolor pierwszego planu ustawiony na wybrany kolor wyróżniający użytkownika:

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

Obsługa ligatury opartej na łączniku

WPF nigdy nie obsługiwał ligatur opartych na łącznikach w kontrolkach interfejsu TextBlockużytkownika, takich jak . To długotrwałe pytanie społeczności zostało dodane na platformie .NET 9.

Oto obraz ligatur, które nie są stosowane do glifów na platformie .NET 8:

Zrzut ekranu prostej aplikacji WPF z blokiem tekstowym pokazującym, jak glify nie są łączone w ligatury z platformą .NET 8.

Teraz ten sam tekst co renderowany na platformie .NET 9:

Zrzut ekranu prostej aplikacji WPF z blokiem tekstowym pokazującym, jak glify są łączone w ligatury z platformą .NET 9.

BinaryFormatter nie jest już obsługiwany

BinaryFormatter jest uważana za niebezpieczną, ponieważ jest podatna na ataki deserializacji, które mogą prowadzić do odmowy usługi (DoS), ujawniania informacji lub zdalnego wykonywania kodu. Została zaimplementowana przed zrozumieniem luk w zabezpieczeniach deserializacji, a jej projekt nie jest zgodna z nowoczesnymi najlepszymi rozwiązaniami w zakresie zabezpieczeń.

Począwszy od platformy .NET 9, jej implementacja została usunięta, aby zapobiec tym zagrożeniom bezpieczeństwa. Gdy BinaryFormatter jest używany, PlatformNotSupportedException zgłaszany jest wyjątek.

WPF używany BinaryFormatter w wielu scenariuszach, takich jak podczas serializacji danych do schowka i operacji przeciągania i upuszczania. Wewnętrznie WPF nadal używa bezpieczniejszego podzestawu BinaryFormatter do obsługi określonych przypadków użycia ze znanym zestawem typów.

Aby uzyskać więcej informacji na temat BinaryFormatterprogramu , zobacz Przewodnik migracji WPF dla narzędzia BinaryFormatter.