当前位置:首页 > 科技  > 软件

现代WPF界面轻松实现:探秘轻量级WPFUI库,MVVM与依赖注入一体化

来源: 责编: 时间:2024-03-26 09:34:27 277观看
导读概述:一款名为WPFUI的轻量级开源库,为WPF应用程序提供现代化界面。支持MVVM和Microsoft.Extensions.DependencyInjection,简单上手。无第三方依赖,内置两套皮肤,可自定义样式。适用于一般应用场景,不受MVVM框架限制。通过简

WiC28资讯网——每日最新资讯28at.com

概述:一款名为WPFUI的轻量级开源库,为WPF应用程序提供现代化界面。支持MVVM和Microsoft.Extensions.DependencyInjection,简单上手。无第三方依赖,内置两套皮肤,可自定义样式。适用于一般应用场景,不受MVVM框架限制。通过简单的引用和配置,快速构建现代化WPF应用,提升用户体验WiC28资讯网——每日最新资讯28at.com

最近要做个小工具软件,发现以前用的WPF界面有点老了,所以在网上找下,发现一个用起来还可以的WPFUI库,MVVM也支持得很好,同时支持微软官方的依赖注入框架Microsoft.Extensions.DependencyInjection。WiC28资讯网——每日最新资讯28at.com

先来看看运行效果:WiC28资讯网——每日最新资讯28at.com

WiC28资讯网——每日最新资讯28at.com

使用方法也比较简单。WiC28资讯网——每日最新资讯28at.com

1、引用库:

WiC28资讯网——每日最新资讯28at.com

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注册相关的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页面进行主界面布局

这个代码有点多就不粘了,文章结尾有源代码下载,如果感兴趣可以下载看看。WiC28资讯网——每日最新资讯28at.com

5、优点

  • 这个库包含了一些常用的控件没有过多的封装(轻量级),但足够一般应用场景使用
  • 包含了两套皮肤(如果不满意可以自定义样式个性色调)
  • 没有其它第三方的依赖,使用起来比较简单
  • 使用官方Microsoft.Extensions.DependencyInjection作为依赖注入框架,也可以使用其他的
  • 没有MVVM框架的限制,可以使用CommunityToolkit.Mvvm、Prism或其他的

再附上几张效果图:WiC28资讯网——每日最新资讯28at.com

WiC28资讯网——每日最新资讯28at.com

WiC28资讯网——每日最新资讯28at.com

WiC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-79294-0.html现代WPF界面轻松实现:探秘轻量级WPFUI库,MVVM与依赖注入一体化

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 集成测试: 提高软件质量的关键步骤

下一篇: 非Controller控制层参数校验要怎么做

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top