現(xiàn)代WPF界面輕松實(shí)現(xiàn):探秘輕量級WPFUI庫,MVVM與依賴注入一體化
概述:一款名為WPFUI的輕量級開源庫,為WPF應(yīng)用程序提供現(xiàn)代化界面。支持MVVM和Microsoft.Extensions.DependencyInjection,簡單上手。無第三方依賴,內(nèi)置兩套皮膚,可自定義樣式。適用于一般應(yīng)用場景,不受MVVM框架限制。通過簡單的引用和配置,快速構(gòu)建現(xiàn)代化WPF應(yīng)用,提升用戶體驗(yàn)
最近要做個(gè)小工具軟件,發(fā)現(xiàn)以前用的WPF界面有點(diǎn)老了,所以在網(wǎng)上找下,發(fā)現(xiàn)一個(gè)用起來還可以的WPFUI庫,MVVM也支持得很好,同時(shí)支持微軟官方的依賴注入框架Microsoft.Extensions.DependencyInjection。
先來看看運(yùn)行效果:
使用方法也比較簡單。
1、引用庫:
2、App.xaml引入資源
<Application
x:Class="DesktopApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
DispatcherUnhandledException="OnDispatcherUnhandledException"
Exit="OnExit"
Startup="OnStartup">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Dark" />
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
3、App.xaml.cs注冊相關(guān)的Page、ViewModel、Service
public partial class App
{
// The.NET Generic Host provides dependency injection, configuration, logging, and other services.
// https://docs.microsoft.com/dotnet/core/extensions/generic-host
// https://docs.microsoft.com/dotnet/core/extensions/dependency-injection
// https://docs.microsoft.com/dotnet/core/extensions/configuration
// https://docs.microsoft.com/dotnet/core/extensions/logging
private static readonly IHost _host = Host
.CreateDefaultBuilder()
.ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); })
.ConfigureServices((context, services) =>
{
services.AddHostedService<ApplicationHostService>();
services.AddSingleton<MainWindow>();
services.AddSingleton<MainWindowViewModel>();
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<ISnackbarService, SnackbarService>();
services.AddSingleton<IContentDialogService, ContentDialogService>();
services.AddSingleton<DashboardPage>();
services.AddSingleton<DashboardViewModel>();
services.AddSingleton<DataPage>();
services.AddSingleton<DataViewModel>();
services.AddSingleton<SettingsPage>();
services.AddSingleton<SettingsViewModel>();
}).Build();
/// <summary>
/// Gets registered service.
/// </summary>
/// <typeparam name="T">Type of the service to get.</typeparam>
/// <returns>Instance of the service or <see langword="null"/>.</returns>
public static T GetService<T>()
where T : class
{
return _host.Services.GetService(typeof(T)) as T;
}
/// <summary>
/// Occurs when the application is loading.
/// </summary>
private void OnStartup(object sender, StartupEventArgs e)
{
_host.Start();
Wpf.Ui.Appearance.Theme.Apply(Wpf.Ui.Appearance.ThemeType.Dark);
}
/// <summary>
/// Occurs when the application is closing.
/// </summary>
private async void OnExit(object sender, ExitEventArgs e)
{
await _host.StopAsync();
_host.Dispose();
}
/// <summary>
/// Occurs when an exception is thrown by an application but not handled.
/// </summary>
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0
}
4、MainWindow頁面進(jìn)行主界面布局
這個(gè)代碼有點(diǎn)多就不粘了,文章結(jié)尾有源代碼下載,如果感興趣可以下載看看。
5、優(yōu)點(diǎn)
- 這個(gè)庫包含了一些常用的控件沒有過多的封裝(輕量級),但足夠一般應(yīng)用場景使用
- 包含了兩套皮膚(如果不滿意可以自定義樣式個(gè)性色調(diào))
- 沒有其它第三方的依賴,使用起來比較簡單
- 使用官方Microsoft.Extensions.DependencyInjection作為依賴注入框架,也可以使用其他的
- 沒有MVVM框架的限制,可以使用CommunityToolkit.Mvvm、Prism或其他的
再附上幾張效果圖: