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.
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.SolidColorBrush
lub 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 TextBlock
uż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:
Teraz ten sam tekst co renderowany na platformie .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 BinaryFormatter
programu , zobacz Przewodnik migracji WPF dla narzędzia BinaryFormatter.
.NET Desktop feedback