使用步骤
- Bootstrapper类必要配置
public class Bootstrapper : BootstrapperBase
{
//容器可以更换,只是个IOC容器用来注册服务
private readonly SimpleContainer _container = new SimpleContainer();
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
//实例化容器
_container.Instance(_container);
//注册服务
_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>();
//注册ViewModel类
foreach (var assembly in SelectAssemblies())
{
assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => type.Name.EndsWith("ViewModel"))
.ToList()
.ForEach(viewModelType => _container.RegisterPerRequest(
viewModelType, viewModelType.ToString(), viewModelType));
}
}
//配置开始界面
protected override async void OnStartup(object sender, StartupEventArgs e)
{
//这三种都可以
//await DisplayRootViewForAsync(IoC.Get<ShellViewModel>().GetType());
//await DisplayRootViewForAsync(typeof(ShellViewModel));
await DisplayRootViewFor<ShellViewModel>();
}
//解析IOC容器里的某个实例,通过依赖注入容器来创建一个新实例(如果它还不存在)或返回已经存在的实例(如果它已经被解析过并被容器管理)
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
//获取IOC容器里的所有实例,从某个集合或存储中检索已存在的实例。在DI容器的上下文中,它可能意味着从容器中检索一个已经存在的实例
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
//找对应视图
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
}
- App配置
//前台配置或者后台配置,二选一
<Application x:Class="Caliburn.Micro.Tutorial.Wpf.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Caliburn.Micro.Tutorial.Wpf">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:Bootstrapper x:Key="Bootstrapper" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
public partial class App : Application
{
Bootstrapper _bootstrapper;
public App()
{
_bootstrapper = new Bootstrapper();
}
}
}
- 新建Views类和ViewModels文件夹
CM绑定
<!--原生命令-->
<Button Content="Button Command" Command="{Binding ButtonCommand}"/>
<!--CM绑定名称-->
<Button Content="Button Click Name" Name="ButtonClickName"/>
<!--CM附加属性-->
<Button Content="Button Click Attached Property" cal:Message.Attach="ButtonClickAttachedProperty"/>
<!--CM任意关联-->
<Button Content="Button Click Any ">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessageAction MethodName="ButtonClickAnyBehavior"/>
</i:EventTrigger>
</Button>
<Button Content="Button Click Any" cal:Message.Attach="[Event MouseDoubleClick]=[ButtonClickAny]}"/>
<!--CM有参-->
<Button Content="Button Click " cal:Message.Attach="ButtonClick(object)"/>
<!--CM传属性名称-->
<Button Content="Button Click Property" cal:Message.Attach="ButtonClickProperty(Property)"/>
Caliburn.Micro是一个用于构建WPF、Xamarin.Forms等应用程序的轻量级框架,它采用了MVVM(Model-View-ViewModel)设计模式。在Caliburn.Micro中,Screen和Conductor是两个核心概念,它们各自具有特定的作用和使用方式,并在应用程序中相互关联。
Screen
-
作用:
- Screen是视图模型的基类,提供了生命周期管理和一些辅助功能。
- 通过继承Screen类,视图模型可以自动获得生命周期事件的支持,这些事件可以用于管理资源、更新UI或执行其他操作。
-
使用:
- 视图模型可以通过继承Screen类来使用其提供的功能。
- Screen类定义了多个生命周期管理的方法,如OnActivate和OnDeactivate,用于管理视图模型的激活和停用状态。
- 通过实现INotifyPropertyChanged接口,Screen类还支持属性更改通知,以便UI能够自动更新。
-
关键特性:
- Activated、DeActivated等事件,允许执行自定义的激活和停用逻辑。
- GetView方法可以用于获取与Screen关联的View对象。
Conductor
-
作用:
- Conductor用于管理Screen对象,是Screen对象之间的导航和交互的中心。
- 不同的Screen对象可以通过一个Conductor来管理,实现复杂的导航和交互逻辑。
-
使用:
- 通过继承Conductor类或其派生类(如Conductor.Collection.OneActive等),视图模型可以获得管理Screen对象的能力。
- Conductor类提供了ActivateItemAsync等方法,用于激活、停用和导航不同的Screen对象。
-
关键特性:
- Conductor本身也是一个Screen对象,因为它继承了Screen类,因此也具有Screen的生命周期管理功能。
- Conductor使用了策略模式,允许根据应用程序的需求更改对Screen对象的处理方式。
关联
-
Screen与Conductor的关联:
- Screen对象通过Conductor对象进行管理,实现了视图模型间的导航和交互。
- Conductor可以激活、停用和导航多个Screen对象,从而控制应用程序的UI流程和用户体验。
-
生命周期管理:
- Screen的生命周期由Conductor控制,当Conductor激活一个Screen时,该Screen的OnActivate方法将被调用;当Screen被停用时,其OnDeactivate方法将被调用。
-
UI更新:
- Screen对象通过实现INotifyPropertyChanged接口来通知UI进行更新。当Screen的属性发生变化时,Conductor可以监听这些变化并相应地更新UI。
总结来说,Caliburn.Micro中的Screen和Conductor是相互关联的两个核心概念。Screen提供了视图模型的生命周期管理和辅助功能,而Conductor则用于管理Screen对象并实现视图模型间的导航和交互。它们共同构成了Caliburn.Micro框架中视图模型管理的基础。