手机微网站价,前端页面设计网站,福州医社保增减员在什么网站做,wordpress编辑器知乎01—前言Caliburn.Micro(简称CM)一经推出便备受推崇#xff0c;作为一款MVVM开发模式的经典框架#xff0c;越来越多的受到wpf开发者的青睐.我们看一下官方的描述#xff1a;Caliburn是一个为Xaml平台设计的小型但功能强大的框架。Micro实现了各种UI模式#xff0c;用于解决…01—前言 Caliburn.Micro(简称CM)一经推出便备受推崇作为一款MVVM开发模式的经典框架越来越多的受到wpf开发者的青睐.我们看一下官方的描述Caliburn是一个为Xaml平台设计的小型但功能强大的框架。Micro实现了各种UI模式用于解决实际问题。突出显示的模式包括MVVM表示模型、MVP和MVC。目前CM框架还不不停的开发和迭代中目前最新版本4.0.212推出于2022年8月27日已经可以支持.NET7。02—项目介绍解决方案由四个项目组成见下图HelloWorld框架的搭建、容器注入相关HelloWorld.Core放置数据模型即mvvm中的MHelloWorld.ViewModels模型视图即VM;HelloWorld.Views:V,即视图.项目基于.NET5开发CM框架版本4.0.212运行结果显示03—代码展示和讲解① 首先是HelloWorld讲解这里启动代码Startup.CSpublic class Startup : BootstrapperBase{SimpleContainer _container;public Startup(){Initialize();}protected override void Configure(){_container new SimpleContainer().SingletonIWindowManager, WindowManager().SingletonIEventAggregator, EventAggregator();foreach (var asm in SelectAssemblies()){foreach (var vm in asm.GetTypes()){if (vm.Name.EndsWith(VM)){_container.RegisterPerRequest(vm, null, vm);}}}var myRule new TypeMappingConfiguration{ViewModelSuffix VM,ViewSuffixList new() { }};ViewLocator.ConfigureTypeMappings(myRule);ViewModelLocator.ConfigureTypeMappings(myRule);}protected override void OnStartup(object sender, StartupEventArgs e){base.OnStartup(sender, e);DisplayRootViewForAsyncIndexVM();}protected override IEnumerableAssembly SelectAssemblies(){return new ListAssembly{Assembly.Load(HelloWorld),Assembly.Load(HelloWorld.Views),Assembly.Load(HelloWorld.ViewModels),};}protected override object GetInstance(Type service, string key){return _container.GetInstance(service, key);}}这里容器采用了CM自带的SimpleContainer开始先把窗口管理器和事件聚合器注册到了容器中_container new SimpleContainer().SingletonIWindowManager, WindowManager().SingletonIEventAggregator, EventAggregator();然后通过反射把下面三个程序集Assembly.Load(HelloWorld),Assembly.Load(HelloWorld.Views),Assembly.Load(HelloWorld.ViewModels),中vm结尾的视图模型文件注册到容器foreach (var asm in SelectAssemblies()){foreach (var vm in asm.GetTypes()){if (vm.Name.EndsWith(VM)){_container.RegisterPerRequest(vm, null, vm);}}}接下来是自定义了一套CM的VM和V的匹配规则默认情况CM的匹配规则是视图以View结尾视图模型以ViewModel结尾这里的规则是VM以VM结尾View只要前缀和Viewmodel的一致就可以var myRule new TypeMappingConfiguration{ViewModelSuffix VM,ViewSuffixList new() { }};ViewLocator.ConfigureTypeMappings(myRule);ViewModelLocator.ConfigureTypeMappings(myRule);②HelloWorld.Views这里放的是视图代码很简单不展开了比较新颖的用法是它通过load函数接在view的cal:Message.Attach[Event Loaded][Loaded($view,$eventArgs)]public void Loaded(UserControl control, RoutedEventArgs event){Debug.WriteLine(control);Debug.WriteLine(event);}③ HelloWorld.ViewModels视图模型LoginVM.cs这是登录窗体的后台逻辑点击登录后发送背景线程异步事件更新进度条public async Task DoLogin(){await _eventAggregator.PublishOnBackgroundThreadAsync(new BusyMessage(true));await Task.Delay(1000);MessageBox.Show(Test Login Success);await _eventAggregator.PublishOnBackgroundThreadAsync(new BusyMessage(false));}IndexVM.cs继承IHandleBusyMessage接收事件更新进度条public Task HandleAsync(BusyMessage message, CancellationToken cancellationToken){if (message.IsBusy){BarValue 50;}else{BarValue 0;}return Task.CompletedTask;}通过ioc容器获取VM: public LoginVM LoginVM { get; set; } IoC.GetLoginVM();public LoginVM LoginVM { get; set; } IoC.GetLoginVM();public TableVM TableVM { get; set; } IoC.GetTableVM();TableVM.cs:数据集合定义 public ObservableCollectionFoo Data { get; set; }开线程更新集合数据用 await Task.Delay(1000);演示一秒Task.Run(async () {while (true){if (IsShow){_data.Add(new Foo{Id Guid.NewGuid(),Name John new Random().Next(1, 100),School 上海大学});Data new ObservableCollectionFoo(_data);}await Task.Delay(1000);}}); [AddINotifyPropertyChangedInterface]来源于可以自动通知界面数据更新。04—源码下载及声明声明首先感谢群友提供源码需要和源码提供者本人直面交流的可以通过邮箱xingrui_zhuangasiasymbol.com 联系.源码百度网盘链接链接https://pan.baidu.com/s/1BHkVEFWHwGQf6EwHpWCBKw
提取码6666
技术群添加小编微信并备注进群小编微信mm1552923
公众号dotNet编程大全