C# 值得永久收藏的WPF项目实战(经典)
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项目实战(经典)相关推荐
- C# WPF项目实战(经典)
目的:输出两台摄像头图像和两路设备图像,每一路设备截图6张 主要知识: 1. 通过SDK调取摄像头图像,并对图像进行剪裁: 2. WPF中定时器DispatcherTimer用法: 3. WPF中跨线 ...
- G7终极2.3.7完美版,黑白分明,值得永久收藏使用
这个是用最新的谷歌源代码编译,绝对完美,绝对终极版了,黑白简约风,值得永久收藏使用.系统流畅.稳定.省电,还等什么,赶快下载刷机吧. (不求多炫彩,不求多酷气,只追求系统的稳定.流畅.省电和简约) R ...
- 值得永久收藏的 C# 设计模式套路(三)
设计模式套路,完结篇. 今天写写设计模式套路中的最后一部分:行为设计模式. 这是这个系列的最后一篇.前两篇在: 值得永久收藏的 C# 设计模式套路(一) 值得永久收藏的 C# 设计模式套路(二) 如果 ...
- 2022年终结版WPF项目实战合集发布
前言 在年中, 组织了一个WPF公益视频教程, 在半天内凑集了2W+的费用由此启动了该视频录制计划, 到目前为止, 视频教程已经结束. 在这里非常感谢参与本次教程以及长期支持的同学, 下面将主要讲解关 ...
- 值得永久收藏的 C# 设计模式套路(二)
设计模式套路,第二弹. 在第一篇中,主要写了创造模式相关的几种套路.如果你是刚看到这个文章,建议你先去看看第一篇 传送门. 这一篇,我们说说结构模式相关的套路. 结构模式,主要作用是将类型.对象和其它 ...
- WPF项目实战合集2——WPF框架
WPF框架MvvmLight 下载安装插件 更换接口与命令 UI界面委托传递参数 命令的泛型编程 Message消息传递 发送消息 注册并接收消息 MicrosoftToolKitMVVM 继承方法与 ...
- 值得永久收藏的 C# 设计模式套路(一)
设计模式知道,套路是个啥? 关于设计模式的说法,网上一搜一大堆,咱就不再去说了. 我的理解,设计模式就是很多NB的大佬们总结出来的,用来处理特定情况的标准解决方案. 那既然是标准方案,就一定会有套路, ...
- 鬼谷子七十二术(完整版)值得永久收藏!终生研读!
静中有动,动中有静,"变生于事.事生谋.谋生计.计生议.议生说.说生进.进生退.退生制,因以于制事". 第一计 阳谋阴谋 鬼谷子曰:"智略计谋,各有形容,或圆或方,或阴或 ...
- C# WPF MVVM项目实战(进阶②)
这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片 ...
最新文章
- CSS之布局(盒模型)
- 算法竞赛入门经典(第二版) | 习题3-10 盒子 (pair结构体)(UVa1587,Box)
- NETSH WINSOCK RESET这条命令的含义和作用?
- android url回调json,【求助】本地页面如何取某个URL返回的json
- 【HDU - 5744 】Keep On Movin (回文串性质,贪心思维,不是水题)
- testng 组_TestNG组
- js高级学习笔记(b站尚硅谷)-2-数据、变量、内存三者的关系
- 中国省份城市列表(汉字+拼音)
- 检测点是否在两条平行线段之间_两点距离、点到直线距离、两条直线平行与垂直的判定...
- 如何解决2345看图王无法显示PSD缩略图?
- specification java_Java Specification类代码示例
- 系统平台商家如何快速提升店铺的搜索流量
- 区块链技术成为金融业务应用热点
- win11添加右键在此处打开命令窗口
- 解决win10下localhost打不开的问题
- 【互动媒体技术赏析作业】
- 机械臂动力学——动力学建模
- 基于微信小程序的校园体育馆预约系统.docx
- 中国剩余定理 扩展中国剩余定理 (模板)
- kaggle 入门 泰坦尼克 处理过程