一.简介
CliburnMicro是一个基于.NET平台的轻量级MVVM(Model-View-ViewModel)框架。它旨在简化WPF(Windows Presentation Foundation)和Silverlight应用程序的开发过程。CliburnMicro提供了一套简洁而强大的绑定机制,帮助开发者实现视图和视图模型之间的数据绑定和命令绑定,以及处理用户输入和反馈等任务。使用CliburnMicro,开发者可以更加高效地构建可测试、可扩展和易维护的应用程序。
二.使用
1.使用Nuget搜索Caliburn.Micro进行安装使用。
2.Caliburn.Micro的使用和初始化
新建一个子类AppBootstapper 继承框架的BootstrapperBase类,并重写框架父类的初始化和启动方法。
public class AppBootstapper : BootstrapperBase
{
#region Fields
//IOC容器声明
private CompositionContainer _container;
private IWindowManager _windowManager;
private IEventAggregator _eventAggregator;
private IThemeManager _themeManager;
private Logger _logger;
#endregion
public AppBootstapper()
{
Initialize();
}
#region Overrides
protected override void Configure()
{
AggregateCatalog aggregateCatalog = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());
_container = new CompositionContainer(aggregateCatalog);
var batch = new CompositionBatch();
//注入IoC
batch.AddExportedValue(_container);
_windowManager = new WindowManager();
batch.AddExportedValue(_windowManager);
_eventAggregator = new EventAggregator();
batch.AddExportedValue(_eventAggregator);
_logger = new Logger();
batch.AddExportedValue(_logger);
_themeManager = new ThemeManager();
batch.AddExportedValue(_themeManager);
_container.Compose(batch);
}
protected override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
base.OnUnhandledException(sender, e);
}
protected override object GetInstance(Type service, string key)
{
string contract = string.IsNullOrEmpty(key)
? AttributedModelServices.GetContractName(service)
: key;
var exports = _container.GetExportedValues<object>(contract);
if (exports.Any())
return exports.First();
throw new Exception($"找不到实例 {contract}。");
}
protected override IEnumerable<Assembly> SelectAssemblies()
{
var assemblies = new List<Assembly>()
{
Assembly.GetEntryAssembly(),
Assembly.GetExecutingAssembly(),
};
return assemblies.Where(x => x != null)
.Distinct();
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));
}
protected override void BuildUp(object instance)
{
_container.SatisfyImportsOnce((ComposablePart)instance);
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
_windowManager.ShowWindowAsync(new ShellViewModel());
}
#endregion
}
替换App.xaml里面自带的Url启动方式
使用Caliburn.Micro框架的启动方式,添加系统资源字典,声明子类的标签和x:Key。
<Application x:Class="ProjectM.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ProjectM"
xmlns:com="clr-namespace:ProjectM.Components">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<com:AppBootstapper x:Key="bootstapper"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
3. AppBootstapper 重写和调用父类方法
3.1 Initialize():初始化Caliburn.Micro框架;
3.2 override void Configure():应用程序启动时的一个重要步骤,通过调用合适的配置方法和注册逻辑,可以确保应用程序能够正确地运行和配置相关的组件和服务。在这个方法内部可以将系统常用组件注入到容器中。
3.3 override void OnUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e):处理应用程序中的未处理异常。
3.4 override void OnStartup(object sender, StartupEventArgs e):应用启动后执行。
4. AppBootstapper 对象初始化
4.1 CompositionContainer
用来创建和管理组合部件(composition parts)的容器。组件发现和创建;组件组合和注入;生命周期管理。
在Configure方法中,我们创建了一个AggregateCatalog来加载程序集(这里使用的是当前程序集),然后创建了一个CompositionContainer并进行组合。
在CompositionBatch中,我们注册了IWindowManager,IEventAggregator和其他的实例,以便 Caliburn.Micro 在需要时可以进行依赖注入。最后,通过调用_container.Compose(batch)来触发组合过程。
在GetInstance方法中,我们使用CompositionContainer的GetExportedValues方法来获取满足特定契约(contract)的导出值(exports)。如果存在满足条件的导出对象,则使用第一个导出对象作为实例返回。
4.2 IWindowManager
是 Caliburn.Micro MVVM 框架中的控制窗口管理的接口。它定义了一组方法,用于创建、显示和关闭窗口,以及管理窗口之间的导航。
//1.创建和显示窗口:
var windowManager = new WindowManager();
windowManager.ShowWindow(new ShellViewModel());
//2.关闭窗口:
windowManager.Close(new ShellViewModel());
//3.显示模态对话框:
var result = windowManager.ShowDialog(new MessageViewModel("This is a modal dialog!"));
//4.窗口导航:
windowManager.NavigateToViewModel<DashboardViewModel>();
4.3 IEventAggregator
是 Caliburn.Micro MVVM 框架中的事件聚合器接口。它提供了一种用于发布和订阅事件的解耦机制,以方便在应用程序的各个部分之间进行通信和交互。
4.3.1 .定义事件类:创建一个公共的事件类,该类可以包含任何你想要传递的事件数据。
public class MyEvent
{
public string Message { get; set; }
}
4.3.2 发布事件:在需要发布事件的地方,获取 IEventAggregator
的实例,并使用其 PublishOnUIThread
或 PublishOnBackgroundThread
方法来发布事件。你可以使用方法参数将事件实例传递给订阅者。
private readonly IEventAggregator _eventAggregator;
public MyPublisher(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}
public void PublishEvent()
{
_eventAggregator.PublishOnUIThread(new MyEvent { Message = "Hello, subscribers!" });
}
4.3.3 订阅事件:在需要订阅事件的地方,获取 IEventAggregator
的实例,并使用其 Subscribe
方法来订阅事件。可以通过实现 IHandle<T>
接口,并在订阅时将订阅者自身传递给 Subscribe
方法。
public class MySubscriber : IHandle<MyEvent>
{
private readonly IEventAggregator _eventAggregator;
public MySubscriber(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
_eventAggregator.Subscribe(this);
}
public void Handle(MyEvent message)
{
// 处理事件
Console.WriteLine(message.Message);
}
}
5. IOC容器对象使用
public class ViewModelBase
: Screen
{
public IWindowManager WindowManager =>
IoC.Get<IWindowManager>();
public IEventAggregator EventAggregator
=> IoC.Get<IEventAggregator>();
public ILogger Logger
=> IoC.Get<ILogger>();
public IThemeManager ThemeManager
=> IoC.Get<IThemeManager>();
}