WPF in .NET 10: What Changed and Is It Worth Upgrading?

·

·

WPF isn’t dead. It’s the framework behind a huge number of enterprise Windows desktop applications, and Microsoft continues to maintain and improve it with every .NET release. But it’s also not getting the same investment as MAUI or Blazor — which makes the .NET 10 update notable: it’s more than routine maintenance.

The Windows 11 Fluent theme alone is the most significant visual update WPF has received in over a decade. Here’s what changed and what it means for your existing WPF app.

Table of Contents

Windows 11 Fluent Theme

The headline change in WPF .NET 10 is the new Fluent theme — a built-in theme that makes WPF apps look like native Windows 11 applications. Rounded corners, Mica/Acrylic-style backgrounds, proper light/dark mode support, and Windows 11’s system accent color integration.

Enabling the Fluent Theme

<!-- App.xaml -->
<Application x:Class="MyApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!-- Enable Fluent theme -->
                <ResourceDictionary Source="pack://application:,,,/PresentationFramework.Fluent;component/Themes/Fluent.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
// Or via code in App.xaml.cs
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        ThemeManager.SetTheme(this, ThemeMode.System); // Follows Windows setting
        // Or: ThemeMode.Light, ThemeMode.Dark
        base.OnStartup(e);
    }
}

What the Fluent Theme Changes

  • Rounded corners on buttons, text boxes, combo boxes, and list items
  • System accent color — buttons and focused controls use the user’s Windows accent color
  • Dark/Light mode — controls adapt automatically when Windows theme changes
  • Updated typography — Segoe UI Variable font with proper weight and size scaling
  • Hover and press states — modern subtle animations on interactive elements
  • Updated scrollbars — thin, modern scrollbars that expand on hover (Windows 11 style)

Applying System Backdrop (Mica)

// Window with Mica backdrop (Windows 11 only)
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        WindowBackdropType = BackdropType.Mica;
    }
}

// XAML property
<Window WindowBackdropType="Mica"
        Background="Transparent">
</Window>

Limitations

The Fluent theme is opt-in — existing apps won’t change appearance after upgrading. Mica backdrop requires Windows 11 and falls back gracefully on Windows 10. Custom control templates designed for Aero/Classic themes will need updating to look correct with Fluent.

Performance Improvements

Layout Performance

WPF’s layout system received targeted optimizations in .NET 10 — specifically for scenarios with large numbers of items in virtualized panels (VirtualizingStackPanel, VirtualizingWrapPanel). Scrolling performance in large ListBox and DataGrid controls is improved, particularly on high-DPI displays.

Startup Time

.NET 10’s overall AOT and startup improvements benefit WPF apps. Cold start times on modern hardware are noticeably faster compared to .NET 8, driven by improved framework assembly loading rather than WPF-specific changes.

Reduced Memory Allocations

WPF’s data binding engine received allocation optimizations — binding paths that were previously creating intermediate objects on each property change evaluation now reuse objects more aggressively. Apps with many bindings updating frequently (dashboards, live data views) will see reduced GC pressure.

// Binding performance tip — still relevant in .NET 10
// Use x:Static instead of ResourceDictionary lookup for frequently accessed resources
<Label Foreground="{x:Static SystemColors.ControlTextBrush}" />
// Instead of:
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />

Accessibility Fixes

.NET 10 includes a significant batch of accessibility fixes for WPF — many of which are required for enterprise apps targeting government or finance sectors with strict WCAG compliance requirements.

UI Automation Improvements

  • Screen reader (Narrator, NVDA, JAWS) support improved for DataGrid, TreeView, and ListView
  • Keyboard navigation corrected for complex control hierarchies
  • Accessible names now propagate correctly through ContentPresenter
  • AutomationProperties.ControlType reports correctly for custom controls inheriting from standard controls
<!-- Set accessible name for icon-only buttons -->
<Button AutomationProperties.Name="Close dialog"
        AutomationProperties.HelpText="Closes the current dialog without saving">
    <Image Source="close_icon.png" />
</Button>

Rendering and DPI Changes

Improved Per-Monitor DPI v2 Support

WPF .NET 10 improves support for Per-Monitor DPI v2 (PMv2) — the Windows feature that allows different DPI scaling per monitor. Apps moved between a 100% DPI laptop screen and a 150% DPI external monitor now reflow more reliably without requiring app restarts.

<!-- app.manifest — enable PMv2 for your WPF app -->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
      PerMonitorV2
    </dpiAwareness>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      true/pm
    </dpiAware>
  </windowsSettings>
</application>

Text Rendering Improvements

ClearType text rendering on high-DPI displays has several improvements in .NET 10 — specifically fixing blurry text that appeared when TextOptions.TextFormattingMode was set to Ideal on fractional scaling factors (125%, 150%).

New and Updated Controls

Updated DataGrid

DataGrid receives the most significant control update in .NET 10:

  • Improved column virtualization for wide grids (100+ columns)
  • Better frozen column behavior — frozen columns no longer flicker during horizontal scroll
  • New DataGrid.RowBackground alternation now respects Fluent theme color tokens
<DataGrid ItemsSource="{Binding Products}"
          AutoGenerateColumns="False"
          EnableRowVirtualization="True"
          EnableColumnVirtualization="True"
          VirtualizingPanel.IsVirtualizing="True"
          VirtualizingPanel.VirtualizationMode="Recycling">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Header="Price" Binding="{Binding Price, StringFormat=C}"
                            Width="100" IsFrozen="True" />
    </DataGrid.Columns>
</DataGrid>

Improved RichTextBox

RichTextBox gets better performance for large documents and improved spell-check integration with Windows 11’s built-in spell checker.

Breaking Changes

  • Minimum Windows version: .NET 10 WPF requires Windows 10 version 1809 (October 2018 Update) or later. Windows 7/8 support ended with .NET 3.1.
  • Fluent theme resource keys: If you reference specific WPF theme resource keys (e.g., SystemColors brushes) by key name, some keys changed in the Fluent theme. Use the theme-neutral versions where possible.
  • Default DPI behavior: Some DPI scaling default behaviors changed in .NET 10 for PMv2 apps. Test on multi-monitor setups after upgrading.
  • BitmapImage caching: Default cache behavior for BitmapImage changed — explicitly set CacheOption if your app relies on specific caching behavior.

Upgrading from .NET 8 to .NET 10

Step 1: Update the Project File

<!-- .csproj changes -->
<PropertyGroup>
    <!-- Change from net8.0-windows to net10.0-windows -->
    <TargetFramework>net10.0-windows</TargetFramework>
    <UseWPF>true</UseWPF>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

Step 2: Update NuGet Packages

# Update all packages to .NET 10 compatible versions
dotnet outdated --upgrade

Step 3: Run and Review Warnings

Build the project and address any obsolete API warnings. Run the app on your primary development machine and verify rendering, then test on different DPI configurations.

Step 4: Optional — Enable Fluent Theme

Fluent theme is opt-in. Add it to App.xaml and test all screens. Expect to adjust some custom control templates that reference Aero-specific resource keys.

Step 5: Test Accessibility

Run Windows Narrator against key screens — the accessibility fixes in .NET 10 may change how your UI is announced, which could affect compliance testing results (positively).

WPF vs .NET MAUI for New Desktop Apps

If you’re starting a new Windows desktop app in 2026, the WPF vs MAUI question comes up. Here’s the honest comparison:

Choose WPF When:

  • Windows-only app — no need for macOS or mobile targets
  • Complex desktop UI: dockable panels, MDI, rich data grids, drag-and-drop, custom controls
  • Existing team expertise in XAML and WPF
  • Mature third-party control ecosystem required (DevExpress, Telerik, Syncfusion WPF controls)
  • CAD, financial analysis, or other Windows-specific tool applications

Choose .NET MAUI When:

  • Cross-platform is required (Windows + macOS, or Windows + mobile)
  • Building a new app without existing WPF investment
  • Consumer-facing app where iOS/Android support matters
  • Team already knows or is learning MAUI

WPF is not obsolete. For Windows-only desktop apps, it remains the most mature and capable option in the .NET ecosystem. MAUI’s Windows support exists but is weaker than WPF for complex desktop UI scenarios.

FAQ

Is WPF still being actively developed by Microsoft?

Yes — WPF is open-source on GitHub and receives contributions from both Microsoft and the community. .NET 10 includes over 150 WPF-related commits. It’s maintained, not actively expanded with major new features, but it gets meaningful improvements every release.

Does the Fluent theme work on Windows 10?

The Fluent theme works on Windows 10, but Mica/Acrylic backdrop effects require Windows 11 and fall back gracefully on Windows 10. The rounded corners, updated colors, and dark mode support work on Windows 10 version 1809+.

Can I use WPF and .NET MAUI in the same solution?

Yes — they’re separate projects. Some teams build a WPF desktop app and a MAUI mobile companion app sharing a common business logic library. The shared library targets netstandard2.0 or net10.0 without platform-specific targets.

Should I migrate from WPF .NET Framework to WPF .NET 10?

If your app is actively developed and maintained: yes. .NET 10 WPF is faster, has better tooling, and gets security patches. If your app is in maintenance-only mode with no new features: evaluate carefully — the migration effort may not be justified for a stable, unchanging app.

Does .NET 10 WPF work with existing MVVM frameworks like Prism or MvvmCross?

Yes — Prism 9.x and later fully support .NET 10 WPF. MvvmLight is archived but the community fork MVVMLight.Core works. CommunityToolkit.Mvvm (the recommended modern choice) works perfectly with WPF on .NET 10.

Conclusion

WPF in .NET 10 is the best version of WPF since its introduction. The Fluent theme gives Windows 11 apps a modern look without a full rewrite, the performance improvements benefit apps with heavy data binding, and the accessibility fixes matter for enterprise compliance.

Is it worth upgrading from .NET 8? Yes, for actively maintained apps — the upgrade is straightforward and the Fluent theme alone may justify the effort if your users are on Windows 11. For dormant apps, the risk/reward calculation is less clear.

WPF isn’t going anywhere. If you’re building Windows desktop applications, it remains the right tool for complex, feature-rich UIs — and .NET 10 makes it look the part on modern Windows.

[INTERNAL_LINK: .NET MAUI vs WPF for desktop apps] [INTERNAL_LINK: MVVM with CommunityToolkit.Mvvm guide]


Leave a Reply

Your email address will not be published. Required fields are marked *