WPF三方UI库全局应用MessageBox样式(.NET6版本)

一、问题场景

使用HandyControl简写HC 作为基础UI组件库时,希望系统中所有的MessageBox 样式都使用HCMessageBox,常规操作如下:

在对应的xxxx.cs 顶部使用using 指定特定类的命名空间。

cs 复制代码
using MessageBox = HandyControl.Controls.MessageBox;

这样,当前页面对应的MessageBox 就都是对应指定类型的控件实例。这样做虽然能够解决样式问题,弊端也比较明显,如果项目页面较多,交互复杂度高一些,需要修改的页面工作量也就大了。粘贴复制,粘贴复制也是需要时间和成本的。以前的一种解决方式是通过获取原生MessageBox句柄(钩子)方式对样式进行替换实现全局的处理。

二、解决方案

NET6时,引入了全局GlobalUsings,用于实现程序集项目中对目标库的全局声明和引用。

需要对项目文件进行启用<ImplicitUsings>enable</ImplicitUsings>,配置如下:

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">
<!--省略配置内容-->
  <PropertyGroup>
   <!--省略配置内容-->
    <UseWPF>true</UseWPF>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
  <ItemGroup>
    <!--引入UI库Nuget依赖-->
	<PackageReference Include="HandyControl" Version="3.5.1" />
</ItemGroup>

<!--省略配置内容-->
</Project>

默认情况下启用之后,项目的全局引用会自动在本地生成编译文件,为方便管理,可以创建一个GlobalUsings.cs文件用于全局引用的可控管理,类文件名字实际并无特定要求,只是参考其他项目,这个名字看起来好识别。

而类文件中就是包含的着全局的引用配置,关键字使用global using

cs 复制代码
global using MessageBox = HandyControl.Controls.MessageBox;

这样编译生成,当前项目能够尽可能少的去添加头部引用。

案例代码ViewAViewModel.cs

cs 复制代码
public class ViewAViewModel : BindableBase
{

    public DelegateCommand UrlCommand { get; private set; }
    public ViewAViewModel()
    {
        UrlCommand = new DelegateCommand(GetUrl);
    }

    private void GetUrl()
    {
       MessageBox.Show("测试成功","消息提示");
       throw new NotImplementedException();
    }
}

程序效果如下:

弹框效果:

相关推荐
rockey62710 小时前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
叫我少年12 小时前
ASP.NET Core 最小 API 快速参考
.net·api
枫叶林FYL13 小时前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf
她说彩礼65万18 小时前
WPF 多值转换器
wpf
无心水21 小时前
【分布式利器:金融级】金融级分布式架构开源框架全景解读
人工智能·分布式·金融·架构·开源·wpf·金融级框架
步步为营DotNet21 小时前
深入.NET 11:C# 14 在边缘计算数据处理的优化与实践
c#·.net·边缘计算
她说彩礼65万21 小时前
WPF 转换器
wpf
WPF工业上位机2 天前
匠心研智造,同心赴新程-WPF硬件通讯之串口&Socket
wpf
步步为营DotNet2 天前
洞悉.NET 11:Blazor 与 Microsoft.Extensions.AI 的融合创新实践
人工智能·microsoft·.net
回忆2012初秋2 天前
.NET 8.0 实战:基于 MQTTnet 封装高可用的 MQTT 发布/订阅工具类
开发语言·mqtt·.net