当前位置: 首页 > 工具软件 > Micro > 使用案例 >

Caliburn.Micro入门

韩梓
2023-12-01

1.简介

Caliburn是Rob Eisenberg在2009年提出的一个开源框架,可以应用于WPF,Silverlight,WP7等,框架基于MVVM模式,像它的名字一样,是企业级应用的一把利器。而Caliburn.Micro是Caliburn项目的精简版,重构了Caliburn的代码,精简掉了一些不常用的功能。

2.CM优点

1. ActionMessage,结合了Blend中的TriggerAction,可以把UI控件中的事件绑定到后台方法,类似于CallMethodAction。CM对ActionMessage进行了很多扩展,包括可以传入多个参数,参数支持绑定,可以通过CanExecute作执行前判断并设置控件的Enable等。
2. Conventions,协定,这个词听上去有点虚,其实就是智能匹配的意思。CM制定了一系列匹配的规则,比如说View和ViewModel之间的匹配,绑定时传入控件名可以找到控件,传入方法名可以绑定到方法等等。
3. Screen和Conductor,作为一个Presentation的框架,各个UI部件(Widget或者叫Pad)的管理是必不可少的。Screen就是用来表示UI部件的,它定义了一些列UI部件的生命期事件,比如Activated,DeActivated等。Conductor是用来管理Screen的,类似于传统的Controller,不同的Screen可以用一个Conductor来管理,Conductor也使用了策略模式允许更改对Screen的处理。
4. Coroutines,协同程序,定义了一组程序的执行,简化了异步编程。比如说在网络中下载图片并显示,通常来说需要显示BusyIndicator,后台线程去网络读取图片,读取成功后Invoke到UI线程,取消BusyIndicator,显示图片。CM提供了一个IResult接口,大大的简化了异步编程,结合ActionMessage,为AOP的扩展提供了可能。
5. 配置性和扩展性,CM移除掉了原Caliburn的一些IOC实现,作为一个通用框架,最常用办法就是使用工厂模式结合配置文件提供可配置性,使用IOC来解耦组件间的依赖。CM默认是使用MEF来做IOC扩展的,你可以自定义Bootstrapper来使用你喜欢的IOC容器,如Unity等。
6. 设计时支持(Design-time support),CM中的ActionMessage是继承自Blend中的TriggerAction的,也就是说可以在Blend编辑ActionMessage,大大方便了使用。

3.简单demo

1.先建一个WPF工程,取名CaliburnMicroTest;
2.使用Nuget引入Caliburn.Micro.dll、System.Windows.Interactivity.dll和System.ComponentModel.Composition.dll三个包(第一个包是提供Caliburn.Micro的功能函数的,后两个dll是为了添加MEF的容器时使用的);
3.删除MainWindow.xaml项目文件(也就是新建项目自带的主窗口)。在App.xaml项目文件中,删除 StartupUri 节点特性,此步骤是为了将初始化窗口重建,准备指向Caliburn Micro,而不是WPF自定义的;
4.新建一个HelloViewModel.cs的ViewModel,此时的ViewModel的命名必须以ViewModel结尾,这是CM规定的命名规范,必须遵循,代码如下所示:
public class HelloViewModel : PropertyChangedBase {
		public string Name {
			get { return name; }
			set {
				name = value;
				NotifyOfPropertyChange(() => Name);
				NotifyOfPropertyChange(() => CanSayHello);
			}
		}

		public bool CanSayHello {
			get { return !string.IsNullOrWhiteSpace(name); }
		}

		public void SayHello() {
			MessageBox.Show(string.Format("Hello {0}!", Name));
		}

		private string name;
	}
另外,这个类继承于PropertyChangedBase, 这是Caliburn Micro提供的,用于自动属性更改通知,所以我们不需要实现INotifyPropertyChanged。
5.根据ViewModel的属性和方法,实现HelloView,此View的命名必须以View结尾,这是CM规定的命名规范,必须遵循,代码如下所示:
<Window.Resources>
            <Style TargetType="TextBox">
                <Setter Property="MinWidth" Value="200" />
                <Setter Property="Margin" Value="10" />
                <Setter Property="Padding" Value="4,2" />
                <Setter Property="FontSize" Value="24" />
            </Style>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="10" />
                <Setter Property="Padding" Value="20,0" />
            </Style>
        </Window.Resources>
        <DockPanel>
            <Button x:Name="SayHello" DockPanel.Dock="Right" Content="Say Hello" />
            <TextBox x:Name="Name" />
        </DockPanel>
说明:
1)视图名称应该以“View”结束并且开始部分要和对应的视图模型使用相同的名称。 对于我的例子,“HelloView”视图对应“HelloViewModel”。
2)此处Button的Name是SayHello,与HelloViewModel中的SayHello()函数同名,那么Button的Click事件将直接和此方法绑定(这是CM的机制)
3)TextBox的Name为Name,与HelloViewModel中的Name属性同名,那么TextBox的Text属性将和此属性绑定,ViewModel中Name属性的改变将显示在View上
6.建立好View和ViewModel的匹配后,子类化Bootstrapper,代码如下:
public class HelloBootstrapper : BootstrapperBase {
		public HelloBootstrapper() {
			Initialize();
		}

		protected override void OnStartup(object sender, StartupEventArgs e) {
			DisplayRootViewFor<HelloViewModel>();
		}
	}
OnStartup()函数的DisplayRootViewFor<>()函数设置你想要在启动时使用的视图模型。
7.将HelloBootstrapper添加到Application.Resources,代码如下:
<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:HelloBootstrapper x:Key="bootstrapper"></local:HelloBootstrapper>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>


8.enjoy你的小代码
 类似资料: