文章目录

  • 前言
    • 1.Caliburn.Micro是什么
    • 2.Caliburn.Micro的主要功能
  • 一、Caliburn.Micro的使用基于WPF的改造
    • 1.项目介绍
    • 2.安装软件包
    • 3.改造App启动项目
    • 4.BootstrapperBase启动类
    • 5.视图和视图模型详解
      • 5.1 index
        • 5.1.1 视图模型
        • 5.1.2 视图
      • 5.2 Login
        • 5.2.1 视图模型
        • 5.2.2 视图
      • 5.3 Login
        • 5.3.1 视图模型
        • 5.3.2 视图

前言

1.Caliburn.Micro是什么

Caliburn.Micro是一个微软开发的用于构建WPF,Silverlight和Windows Phone应用程序的MVVM(模型-视图-视图模型)框架。它提供了一系列的工具和类,帮助开发人员更快,更轻松地构建美观的和可维护的应用程序。

2.Caliburn.Micro的主要功能

Caliburn.Micro是一个小型MVVM框架,主要提供了以下功能:

  1. 简化MVVM模式的实施
  2. 视图绑定
  3. 统一方式的消息机制
  4. 基于事件和命令的行为触发
  5. 支持视图导航
  6. 支持Windows Phone和Silverlight平台

Caliburn.Micro 的Github网址:https://github.com/Caliburn-Micro/Caliburn.Micro


Caliburn.Micro 官网:https://caliburnmicro.com/

一、Caliburn.Micro的使用基于WPF的改造

1.项目介绍

  • HelloWorld:框架的搭建、容器注入相关
  • HelloWorld.Core;放置数据模型,即mvvm中的M
  • HelloWorld.ViewModels:模型视图,即VM
  • HelloWorld.Views:V,即视图

本项目是基于.Net 7 的

2.安装软件包

PM> Install-Package Caliburn.Micro.Start

3.改造App启动项目

1、清除 App.xaml.cs 文件

using System.Windows;namespace HelloWorld
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{}
}

2、将 AppBoostrapper 添加到 App.xaml 的资源部分

<Application x:Class="HelloWorld.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:HelloWorld"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary><local:Startup x:Key="startup" /></ResourceDictionary></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>

4.BootstrapperBase启动类

public class Startup : BootstrapperBase
{SimpleContainer _container;public Startup(){Initialize();}//配置类protected override void Configure(){//这里容器采用了CM自带的SimpleContainer,并把窗口管理器和事件聚合器注册到了容器中_container = new SimpleContainer().Singleton<IWindowManager, WindowManager>().Singleton<IEventAggregator, EventAggregator>();//通过反射把下面三个程序集中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的匹配规则//1.默认的规则是是:视图以View结尾、视图模型以ViewModel结尾//2.实际规则是视图模型以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);//设置启动视图模型DisplayRootViewForAsync<IndexVM>();}/// <summary>/// 选择程序集/// </summary>/// <returns></returns>protected override IEnumerable<Assembly> SelectAssemblies(){return new List<Assembly>{Assembly.Load("HelloWorld"),Assembly.Load("HelloWorld.Views"),Assembly.Load("HelloWorld.ViewModels"),};}/// <summary>/// 获取实例/// </summary>/// <param name="service"></param>/// <param name="key"></param>/// <returns></returns>protected override object GetInstance(Type service, string key){return _container.GetInstance(service, key);}
}

5.视图和视图模型详解

继承类说明:

  • Screen 和 INotifyPropertyChanged (用于感知并同步所绑定属性的变化)
  • IHandle:IHandle

5.1 index

5.1.1 视图模型

public class IndexVM : Screen, IHandle<BusyMessage>
{private readonly IEventAggregator _eventAggregator;public IndexVM(IEventAggregator eventAggregator){_eventAggregator = eventAggregator;InitVM();}public string AboutTitle { get; set; }public int BarValue { get; set; }//通过ioc容器获取VM:public LoginVM LoginVM { get; set; } = IoC.Get<LoginVM>();public TableVM TableVM { get; set; } = IoC.Get<TableVM>();public string MainName { get; set; } = "一种类似vue的使用方式,抛砖引玉";public void AboutBtn1(){MessageBox.Show("Test AboutBtn1");}//接收事件更新进度条:public Task HandleAsync(BusyMessage message, CancellationToken cancellationToken){if (message.IsBusy){BarValue = 50;}else{BarValue = 0;}return Task.CompletedTask;}protected virtual void InitVM(){AboutTitle = "测试AboutPage 绑定父作用域";_eventAggregator.SubscribeOnUIThread(this);}
}

5.1.2 视图

/// <summary>
/// Index.xaml 的交互逻辑
/// </summary>
public partial class Index : Window
{public Index(){InitializeComponent();}
}
<Window x:Class="HelloWorld.Views.Areas.Home.Index"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:home="clr-namespace:HelloWorld.Views.Areas.Home"xmlns:account="clr-namespace:HelloWorld.Views.Areas.Account"xmlns:cal="http://caliburnmicro.com"xmlns:fa="http://schemas.awesome.incremented/wpf/xaml/fontawesome.sharp"Title="{Binding MainName}"mc:Ignorable="d" Width="800" Height="600"d:DesignHeight="450" d:DesignWidth="800"><Grid><Grid.RowDefinitions><RowDefinition /><RowDefinition Height="30" /></Grid.RowDefinitions><TabControl TabStripPlacement="Left"><TabItem><TabItem.Header><StackPanel><fa:IconBlock Icon="Table" FontSize="24" /><TextBlock>Table</TextBlock></StackPanel></TabItem.Header><home:Table cal:Bind.ModelWithoutContext="{Binding}" DataContext="{Binding TableVM}" /></TabItem><TabItem><TabItem.Header><StackPanel><fa:IconBlock Icon="CircleInfo" FontSize="24" /><TextBlock>About</TextBlock></StackPanel></TabItem.Header><home:About cal:Bind.Model="{Binding}" DataContext="{Binding}" /></TabItem><TabItem><TabItem.Header><StackPanel><fa:IconBlock Icon="UserCircle" FontSize="24" /><TextBlock>Login</TextBlock></StackPanel></TabItem.Header><account:Login cal:Bind.ModelWithoutContext="{Binding}" DataContext="{Binding LoginVM}" /></TabItem></TabControl><ProgressBar Grid.Row="1" Value="{Binding BarValue}" Minimum="0" Maximum="100" /></Grid>
</Window>

因为About是绑定Index所以公用事件和变量

<UserControl x:Class="HelloWorld.Views.Areas.Home.About"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:HelloWorld.Views.Areas.Home"mc:Ignorable="d"d:DesignHeight="450" d:DesignWidth="800"><Grid><StackPanel Margin="30"><TextBlock FontSize="20"><Run Text="Title:" /><Run Text="{Binding AboutTitle}" /></TextBlock><Button x:Name="AboutBtn1" >测试按钮</Button></StackPanel></Grid>
</UserControl>

5.2 Login


注意以下代码是它通过load函数接在view

cal:Message.Attach="[Event Loaded]=[Loaded($view,$eventArgs)]"public void Loaded(UserControl control, RoutedEventArgs @event)
{Debug.WriteLine(control);Debug.WriteLine(@event);
}

5.2.1 视图模型

public class LoginVM : Screen
{private readonly IEventAggregator _eventAggregator;public LoginVM(IEventAggregator eventAggregator){_eventAggregator = eventAggregator;}public string Password { get; set; } = "123";public string UserName { get; set; } = "王小虎";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));}public void Loaded(UserControl control, RoutedEventArgs @event){Debug.WriteLine(control);Debug.WriteLine(@event);}
}

5.2.2 视图

<UserControl x:Class="HelloWorld.Views.Areas.Account.Login"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:HelloWorld.Views.Areas.Account"xmlns:cal="http://caliburnmicro.com"cal:Message.Attach="[Event Loaded]=[Loaded($view,$eventArgs)]"mc:Ignorable="d"d:DesignHeight="450" d:DesignWidth="800"><Grid><StackPanel Margin="50"><TextBlock FontSize="24">测试组件绑定自己的vm作用域</TextBlock><DockPanel Margin="0 10"><Label Width="100">用户名:</Label><TextBox x:Name="UserName" /></DockPanel><DockPanel Margin="0 10"><Label Width="100">密码:</Label><TextBox x:Name="Password" /></DockPanel><Button x:Name="DoLogin" Width="120">Login</Button></StackPanel></Grid>
</UserControl>

5.3 Login

5.3.1 视图模型

public class TableVM : Screen
{private List<Foo> _data = new();public TableVM(){InitData();}public ObservableCollection<Foo> Data { get; set; }public bool IsShow { get; set; }public void Loaded(){IsShow = true;}public void Unloaded(){IsShow = false;}private void InitData(){Task.Run(async () =>{while (true){if (IsShow){_data.Add(new Foo{Id = Guid.NewGuid(),Name = "John" + new Random().Next(1, 100),School = "上海大学"});Data = new ObservableCollection<Foo>(_data);}await Task.Delay(1000);}});}
}
/// <summary>
/// 核心模型或许来自网站项目的
/// </summary>
[AddINotifyPropertyChangedInterface]
public class Foo : HelloWorld.Core.Models.Foo
{}

5.3.2 视图

<UserControl x:Class="HelloWorld.Views.Areas.Home.Table"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:HelloWorld.Views.Areas.Home"xmlns:cal="http://caliburnmicro.com"cal:Message.Attach="[Event Loaded]=[Loaded];[Event Unloaded]=[Unloaded]"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><DataGrid ItemsSource="{Binding Data}" IsReadOnly="True"/></Grid>
</UserControl>

源码下载:https://download.csdn.net/download/aa2528877987/87459517

【愚公系列】2023年02月 .NET CORE工具案例-Caliburn.Micro的使用基于WPF的改造的MVVM案例相关推荐

  1. 【愚公系列】2023年02月 .NET CORE工具案例-Lunar日历转换

    文章目录 前言 一.Lunar日历转换 1.安装包 2.相关代码 3.运行 二.用途 1.年历 2.月历 3.佛历 4.道历 5.上班摸鱼 前言 真正的日历产生,大约在一千一百多年前的唐顺宗永贞元年, ...

  2. 【愚公系列】2023年02月 .NET CORE工具案例-办公文档神器Toxy的使用

    文章目录 前言 一.办公文档神器Toxy的使用 1.安装对应的包 2.Word文档操作 2.1 普通文档解析 2.2 表格文档解析 3.Excel文件操作 4.PDF文档操作 5.图片文件操作 总结 ...

  3. 【愚公系列】2023年01月 .NET CORE工具案例-基于SqlSugar的多库多表融合查询

    文章目录 前言 一.基于SqlSugar的多库多表融合查询 1.安装包 2.订单表 3.添加连接 3.1 初始化添加 3.2 动态添加 4.查询 4.1 子表对主表(一对一)查询 4.2 主表对子表( ...

  4. 【愚公系列】2023年01月 .NET CORE工具案例-CS-Script脚本执行引擎

    文章目录 前言 一.CS-Script脚本执行引擎 1.安装包 2.具体使用 2.1 CompileMethod 2.2 LoadMethod 2.3 LoadCode 2.4 CompileCode ...

  5. 【愚公系列】2023年01月 .NET CORE工具案例- Magick.NET神级图片和视频操作库

    文章目录 前言 一.Magick.NET的使用 1.安装包 2.图像的操作 2.1 图像读取 2.1 图像大小改变 2.2 图像格式转换 2.3 PDF转换 2.4 添加水印.文本 2.5 图片合并 ...

  6. 【愚公系列】2023年04月 .NET CORE工具案例-二维码生成器QRCoder

    文章目录 前言 一.二维码生成器QRCoder 1.QRCoder是什么 2.安装包 3.普通二维码 3.1 创建二维码 3.2 设置二维码颜色 3.3 带logo的二维码 4.艺术二维码 4.1 创 ...

  7. 【愚公系列】2023年03月 .NET CORE工具案例-基于AntiXssUF的跨脚本XSS中间件

    文章目录 前言 一.AntiXssUF的跨脚本XSS中间件 1.安装包 2.添加依赖注入 3.使用方式 3.1 构造函数使用 3.2 模型绑定器使用 3.3 直接使用 前言 XSS是一种跨站脚本攻击, ...

  8. 【愚公系列】2022年01月 华为鸿蒙OS-03-四种模式开发实操

    文章目录 前言 一.使用JS语言开发(传统代码方式) 1.index页面源码 2.details页面源码 二.使用JS语言开发(低代码方式) 1.新建工程:注意选择 2.选择低代码新建页面 3.页面分 ...

  9. 人工智能AI主题汇总(至2023年02月11日)

    人工智能(AI)是指机器执行人类能够轻松完成的感知.推理.学习和解决问题等认知功能的能力.过去20年以来,由于互联网产生的海量数据的可用性,人工智能在全球范围内获得了关注.最近,OpenAI上线了Ch ...

最新文章

  1. 序列每天从1开始_时间序列预测一
  2. HTTP请求状态码404相关问题解决
  3. 虚拟机安装中文输入法
  4. 华三云:不做开源的投机者
  5. 部署WEB应用到云服务器时,出现的部分网页不能显示或者连接数据库问题。
  6. 放弃高考“打游戏”,别人25岁年入百万、我退役后回家修车
  7. php自己编译扩展,Linux编译PHP添加扩展库的方法
  8. 数字化转型背景下的金融交易业务中台实践
  9. CS231n李飞飞计算机视觉 神经网络训练细节part1下
  10. 相关性模型 之 皮尔逊相关系数与斯皮尔曼相关系数
  11. 0ctf之simple
  12. ISBN号码(c++)
  13. 关于投入产出表中的一些原则和方法论
  14. 为什么定义补码等于反码加一,知其所以然
  15. 剪绳子(python)
  16. 定了!阿里云盘马上公测 本月正式上线 !
  17. 外汇术语和缩略语解释
  18. Word中题注按章节不同编号
  19. php html5 cms,建站教程|CMS教程|PHP教程|html5教程 - 站长图库
  20. 办公软件excel的实用技巧

热门文章

  1. 微信小程序性能优化方案
  2. 投放钻展要如何布局才能提升钻展推广的ROI
  3. 仿佛来自虚空,Grothendieck的故事2
  4. 2021Kali系列 -- 漏洞搜索(searchsploit)
  5. 计算机三级应该学什么条件,计算机三级报名条件
  6. 亥姆霍兹线圈实验原理及注意事项
  7. Rstudio手动安装程序包
  8. Redis五种数据结构及实现原理
  9. 以大数据重塑K12在线教育
  10. JavaScript——调试的使用