The Evolution of .NET MAUI in .NET 9: Building Better Cross-Platform Applications
David Shergilashvili
Software Development & Technical Solutions Architect | Technical Community Contributor
The release of .NET 9 brings significant advancements to .NET MAUI, transforming how developers approach cross-platform application development. These improvements address many of the challenges developers previously faced while making it easier to create sophisticated, performant applications that work seamlessly across different platforms.
Understanding the New Deployment Requirements
Before diving into the new features, it's important to understand that .NET MAUI 9 has updated its minimum deployment requirements to ensure better performance and security. The platform now requires iOS 12.2 or later for iOS applications and macOS 12.0 (Monterey) for Mac Catalyst applications. This change enables developers to take advantage of newer platform features while maintaining broad device compatibility.
The Revolutionary HybridWebView Control
One of the most exciting additions in .NET MAUI 9 is the new HybridWebView control. This control represents a significant advancement in how native applications can integrate web content. Let's explore how to implement this powerful feature:
public partial class HybridPage : ContentPage
{
public HybridPage()
{
InitializeComponent();
// Initialize the HybridWebView with enhanced features
var hybridView = new HybridWebView
{
Source = "index.html",
// New in .NET 9: Configure web security policies
ContentSecurityPolicy = new ContentSecurityPolicy
{
DefaultSrc = ContentSecurityPolicy.Self,
ScriptSrc = ContentSecurityPolicy.Self,
StyleSrc = ContentSecurityPolicy.Self
}
};
// Set up two-way communication between C# and JavaScript
hybridView.RegisterCallback("invokeFromJs", async (string data) =>
{
// Handle data received from JavaScript
await ProcessJavaScriptData(data);
});
// Initialize JavaScript interface
await hybridView.EvaluateJavaScriptAsync(@"
window.invokeNative = function(data) {
invokeFromJs(JSON.stringify(data));
};
");
}
private async Task ProcessJavaScriptData(string data)
{
try
{
var parsedData = JsonSerializer.Deserialize<MessageData>(data);
// Process the data and update native UI
await UpdateUserInterface(parsedData);
}
catch (Exception ex)
{
await DisplayAlert("Error", "Failed to process data from web view", "OK");
}
}
}
This implementation showcases how the HybridWebView enables seamless integration between native and web content, with built-in security features and efficient communication channels.
Enhanced Controls and UI Improvements
.NET MAUI 9 introduces significant improvements to existing controls and adds new ones for better user experiences. Let's explore the new TitleBar control for Windows applications:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Configure the new TitleBar with enhanced features
TitleBar = new TitleBar
{
Title = "My Application",
Icon = "appicon.png",
HeightRequest = 46,
// New in .NET 9: Support for custom content
Content = new SearchBar
{
Placeholder = "Search",
HorizontalOptions = LayoutOptions.Fill,
Margin = new Thickness(10, 0)
}
};
// New in .NET 9: Handle TitleBar events
TitleBar.IconClicked += async (s, e) =>
{
await DisplayAlert("Info", "Application Menu", "OK");
};
}
}
This example demonstrates how the new TitleBar control provides a native Windows 11 look and feel while maintaining customization flexibility.
Compiled Bindings Revolution
.NET MAUI 9 introduces a groundbreaking improvement in data binding with compiled bindings. This feature significantly improves performance and provides better development-time error checking:
领英推荐
public partial class ProductPage : ContentPage
{
public ProductPage()
{
InitializeComponent();
// Create compiled bindings in code
var productLabel = new Label();
productLabel.SetBinding(
Label.TextProperty,
static (Product product) => product.Name + " - $" + product.Price
);
// New in .NET 9: Advanced binding expressions
var stockIndicator = new Image();
stockIndicator.SetBinding(
Image.IsVisibleProperty,
static (Product p) => p.StockCount > 0,
converter: new BooleanToVisibilityConverter()
);
}
}
// XAML implementation with compiled bindings
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="https://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.ProductPage">
<StackLayout>
<Label Text="{Binding Name, Mode=OneWay, Compiled=True}" />
<Label Text="{Binding Price, StringFormat='${0:F2}', Compiled=True}" />
<Button Text="Buy Now"
Command="{Binding PurchaseCommand, Compiled=True}"
IsEnabled="{Binding IsInStock, Compiled=True}" />
</StackLayout>
</ContentPage>
The compiled bindings feature provides several advantages:
Native AOT and Full Trimming Support
.NET MAUI 9 embraces Native AOT compilation and full trimming support, leading to significant improvements in application performance and size:
// Project file configuration for Native AOT
<PropertyGroup>
<EnableNativeAOT>true</EnableNativeAOT>
<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>full</TrimMode>
</PropertyGroup>
// Application setup with AOT considerations
public class App : Application
{
public App()
{
// Initialize with AOT-friendly configuration
MainPage = new NavigationPage(new MainPage())
{
// Use static resources for AOT compatibility
BarBackgroundColor = Colors.Primary,
BarTextColor = Colors.OnPrimary
};
}
}
These optimizations result in:
Enhanced Blazor Integration
.NET MAUI 9 strengthens its integration with Blazor, making it easier to create hybrid applications:
public class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
// Configure Blazor in MAUI with new features
builder.Services.AddMauiBlazorWebView(options =>
{
// New in .NET 9: Enhanced configuration options
options.EnableDevTools = Debugger.IsAttached;
options.LocalHostDirectory = "wwwroot";
options.EnableWebAssembly = true;
});
// Register services for Blazor components
builder.Services.AddScoped<IDataService, DataService>();
builder.Services.AddScoped<INavigationService, NavigationService>();
return builder.Build();
}
}
// Blazor component integration in XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="https://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml"
xmlns:blazor="clr-namespace:Microsoft.AspNetCore.Components.WebView.Maui;assembly=Microsoft.AspNetCore.Components.WebView.Maui">
<blazor:BlazorWebView>
<blazor:BlazorWebView.RootComponents>
<blazor:RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
</blazor:BlazorWebView.RootComponents>
</blazor:BlazorWebView>
</ContentPage>
Best Practices for .NET MAUI 9
When developing with .NET MAUI 9, consider these optimized approaches:
public partial class OptimizedPage : ContentPage
{
// Use compiled bindings for better performance
private readonly ObservableCollection<Item> _items = new();
public OptimizedPage()
{
InitializeComponent();
// Configure collection view with optimizations
ItemsCollectionView.ItemsSource = _items;
// Use new handler configuration
Microsoft.Maui.Handlers.CollectionViewHandler.Mapper.AppendToMapping("Optimization", (handler, view) =>
{
// Platform-specific optimizations
#if IOS || MACCATALYST
handler.PlatformView.EnablePrefetching = true;
#endif
});
}
// Implement efficient resource cleanup
protected override void OnDisappearing()
{
base.OnDisappearing();
// Clean up resources
_items.Clear();
GC.Collect();
}
}
Conclusion
The improvements in .NET MAUI 9 represent a significant step forward in cross-platform development. With enhanced controls, better performance through compiled bindings and AOT support, and stronger integration with web technologies, developers can create more sophisticated and efficient applications while maintaining a streamlined development process. These advancements make .NET MAUI an even more compelling choice for building modern cross-platform applications.