01

简介

之前也写过好多篇CM框架相关的项目实战文章,比如:

C# WPF框架Caliburn.Micro快速搭建

C# WPF框架Caliburn.Micro入门实例1

C# WPF MVVM项目实战(进阶①)

C# WPF MVVM项目实战(进阶②)

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面

C# WPF mvvm模式下combobox绑定(list<enum>、Dictionary<int,string>)

C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

但是可能这些都是把一个综合性的项目分多个部分分别讲述的,有些初学者没有从前往后连续起来阅读的话,后面的部分可能就不容易理解了。其次,因为没有整体的构思,随着内容的增加,项目越来越显得笨重和凌乱,所以今天我重新搞了一个项目,希望以尽量少的代码,涵盖尽量多的知识点,帮助大家更好的理解和使用CM框架。

02

重要知识点

  • CM框架的配置和启动;

  • CM框架自带ioc容器SimpleContainer用法;

  • MVVM开发模式;

  • 事件聚合器EventAggregator进行事件发布和订阅;

  • 属性通知:

    ① CM框架下基类PropertyChangedBase用法;

    ②PropertyChanged.Fody.3.1.3下 [AddINotifyPropertyChangedInterface]用法;

  • 日志框架:Common.Logging和log4net用法;

  • CM框架下命名约定以及事件关联;

  • 用第三方库Xceed.Wpf.Toolkit.dll做等待窗体;

  • CM框架下Conductor用法;

  • CM框架下IWindowManager;

  • 双检锁单例模式用法;

  • ListBox数据绑定以及窗体切换;

    如果以上知识点你都不敢兴趣或者已经熟知,那这篇文章不适合你,看到这里你就可以关闭网页了!

03

运行结果

04

项目说明

项目主要包括的类文件如下图:

① MainWindowViewModel.cs类:

using PropertyChanged;
using System.Collections.ObjectModel;namespace Caliburn.Micro.Hello
{[AddINotifyPropertyChangedInterface]public class MainWindowViewModel : PropertyChangedBase, IViewModel{private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger<MainWindowViewModel>();public IViewModel ActiveWindowView { get; set; }public ObservableCollection<string> ListBoxItems { get; set; } public string SelectedItem { get; set; }public MainWindowViewModel(){logger.Info($"Enter [MainWindowViewModel].");ListBoxItems = new ObservableCollection<string>() { };ListBoxItems.Add("ShellView");ListBoxItems.Add("EventAggregatorView");ListBoxItems.Add("ConductorView");logger.Info($"Leave [MainWindowViewModel].");}public void ListBoxItems_SelectionChanged(){switch(SelectedItem){case "ShellView":ActiveWindowView = new ShellViewModel();break;case "EventAggregatorView":ActiveWindowView = EventAggregatorViewModel.Instance; break;case "ConductorView":ActiveWindowView = new ConductorViewModel(); break;default:break;}}}
}
  • [AddINotifyPropertyChangedInterface]:需要引用第三方库PropertyChanged.Fody,加上之后类里面的属性变更后会自动通知界面,无需再一个个单独触发;

  • logger是定义的common logging的一个通用日志,需要在nuget上引用:Common.Logging.Log4Net1213;

  • ListBoxItems_SelectionChanged()是listbox的选择改变事件:

    需要在前台附加事件:

    <ListBox Name="ListBoxItems" Grid.Column="0" SelectedItem="{Binding SelectedItem}" Margin="2"
    cal:Message.Attach="[Event SelectionChanged] = [Action ListBoxItems_SelectionChanged]"/>

ActiveWindowView 是我的主窗体,选择那个就激活那个

<ContentControl Name="ActiveWindowView"/>

②ShellViewModel.cs类:

从ioc容器获取一个IWindowManager并显示:

SimpleContainerViewModel simpleContainerViewModel = new SimpleContainerViewModel();IWindowManager windowManager = IoC.Get<IWindowManager>();windowManager.ShowDialog(simpleContainerViewModel);

CanSayHello和SayHello,只有CanSayHello条件满足才会执行SayHello

public bool CanSayHello{get { return !string.IsNullOrWhiteSpace(Name); }}public void SayHello(){  }

③EventAggregatorViewModel.cs

双检锁线程安全的单例模式:

private static EventAggregatorViewModel instance;private static object locker = new object();/// <summary>/// 双检锁/// </summary>public static EventAggregatorViewModel Instance{get{if (instance == null){lock(locker){if (instance == null){instance = new EventAggregatorViewModel();}}}return instance;}}

事件订阅:需要继承事件接口IHandle<PersonInfoEven>

private readonly IEventAggregator eventAggregator;this.eventAggregator = IoC.Get<IEventAggregator>(); this.eventAggregator.Subscribe(this);

事件处理方法:

public void Handle(PersonInfoEven message){PersonInfo = message.ToString();}

④SimpleContainerViewModel.cs

方法1 同步ui发布事件

this.eventAggregator.PublishOnUIThread("i am a chinese");

方法2 开线程去发布

this.eventAggregator.Publish(new PersonInfoEven() {Name = "ZYR", Age = 18, Sex = "man" }, action =>{//方式①//Task.Factory.StartNew(action);//方式②Task.Run(action);});

等待窗体BusyIndicator ,需要引用第三方库Xceed.Wpf.Toolkit,

并添加名称空间:

xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

<xctk:BusyIndicator Name="busyIndicator"  BusyContent="Publish Event ..." IsBusy="{Binding IsShow}" Style="{x:Null}">

⑤ConductorViewModel.cs:此类需要继承Conductor<object>

将需要激活的实例放到ActivateItem,就可以从界面绑定激活对应实例窗体

ActivateItem(new ShellViewModel());

05

源码下载

项目有点长,不可能每个细节都说得到位,能看到这里的都是真爱,那么下面给出源码百度网盘链接:

网盘链接:

https://pan.baidu.com/s/18LOVAIxy7WCWJisiPcOuAQ

提取码:添加小编微信获取

小编微信:mm1552923

公众号:dotNet编程大全

C# 值得永久收藏的WPF项目实战(经典)相关推荐

  1. C# WPF项目实战(经典)

    目的:输出两台摄像头图像和两路设备图像,每一路设备截图6张 主要知识: 1. 通过SDK调取摄像头图像,并对图像进行剪裁: 2. WPF中定时器DispatcherTimer用法: 3. WPF中跨线 ...

  2. G7终极2.3.7完美版,黑白分明,值得永久收藏使用

    这个是用最新的谷歌源代码编译,绝对完美,绝对终极版了,黑白简约风,值得永久收藏使用.系统流畅.稳定.省电,还等什么,赶快下载刷机吧. (不求多炫彩,不求多酷气,只追求系统的稳定.流畅.省电和简约) R ...

  3. 值得永久收藏的 C# 设计模式套路(三)

    设计模式套路,完结篇. 今天写写设计模式套路中的最后一部分:行为设计模式. 这是这个系列的最后一篇.前两篇在: 值得永久收藏的 C# 设计模式套路(一) 值得永久收藏的 C# 设计模式套路(二) 如果 ...

  4. 2022年终结版WPF项目实战合集发布

    前言 在年中, 组织了一个WPF公益视频教程, 在半天内凑集了2W+的费用由此启动了该视频录制计划, 到目前为止, 视频教程已经结束. 在这里非常感谢参与本次教程以及长期支持的同学, 下面将主要讲解关 ...

  5. 值得永久收藏的 C# 设计模式套路(二)

    设计模式套路,第二弹. 在第一篇中,主要写了创造模式相关的几种套路.如果你是刚看到这个文章,建议你先去看看第一篇 传送门. 这一篇,我们说说结构模式相关的套路. 结构模式,主要作用是将类型.对象和其它 ...

  6. WPF项目实战合集2——WPF框架

    WPF框架MvvmLight 下载安装插件 更换接口与命令 UI界面委托传递参数 命令的泛型编程 Message消息传递 发送消息 注册并接收消息 MicrosoftToolKitMVVM 继承方法与 ...

  7. 值得永久收藏的 C# 设计模式套路(一)

    设计模式知道,套路是个啥? 关于设计模式的说法,网上一搜一大堆,咱就不再去说了. 我的理解,设计模式就是很多NB的大佬们总结出来的,用来处理特定情况的标准解决方案. 那既然是标准方案,就一定会有套路, ...

  8. 鬼谷子七十二术(完整版)值得永久收藏!终生研读!

    静中有动,动中有静,"变生于事.事生谋.谋生计.计生议.议生说.说生进.进生退.退生制,因以于制事". 第一计 阳谋阴谋 鬼谷子曰:"智略计谋,各有形容,或圆或方,或阴或 ...

  9. C# WPF MVVM项目实战(进阶②)

    这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片 ...

最新文章

  1. CSS之布局(盒模型)
  2. 算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)
  3. NETSH WINSOCK RESET这条命令的含义和作用?
  4. android url回调json,【求助】本地页面如何取某个URL返回的json
  5. 【HDU - 5744 】Keep On Movin (回文串性质,贪心思维,不是水题)
  6. testng 组_TestNG组
  7. js高级学习笔记(b站尚硅谷)-2-数据、变量、内存三者的关系
  8. 中国省份城市列表(汉字+拼音)
  9. 检测点是否在两条平行线段之间_两点距离、点到直线距离、两条直线平行与垂直的判定...
  10. 如何解决2345看图王无法显示PSD缩略图?
  11. specification java_Java Specification类代码示例
  12. 系统平台商家如何快速提升店铺的搜索流量
  13. 区块链技术成为金融业务应用热点
  14. win11添加右键在此处打开命令窗口
  15. 解决win10下localhost打不开的问题
  16. 【互动媒体技术赏析作业】
  17. 机械臂动力学——动力学建模
  18. 基于微信小程序的校园体育馆预约系统.docx
  19. 中国剩余定理 扩展中国剩余定理 (模板)
  20. kaggle 入门 泰坦尼克 处理过程

热门文章

  1. Python对文件的操作(转)
  2. 超全局变量数组get post requerst resver的使用规则
  3. 在C++中调用DLL中的函数(2)
  4. 记一则Hadoop DataNode OOM故障,以及解决方案
  5. IfElseActivity
  6. Boosting(提升方法)之GBDT
  7. JAVA常见算法题(三十一)---冒泡排序
  8. Linux学习之服务器搭建——DHCP服务器
  9. 网络相关配置,SSH服务,bash, 元字符
  10. ------shell学习