Caliburn.Micro能否用于Visual Studio 2017扩展开发?配置后约定不生效求助
首先明确说:Caliburn.Micro 完全可以用于 Visual Studio 扩展开发,你遇到的约定不生效问题,主要是因为 VS 扩展的 UI 模型和普通 WPF 桌面应用有差异,没适配好这些差异导致的。下面是针对性的解决思路:
1. 适配 ToolWindowPane 的特殊内容绑定逻辑
VS 的 ToolWindowPane 不是标准的 WPF Window,它的内容是通过 Content 属性挂载的,Caliburn.Micro 默认的自动约定绑定是针对标准窗口设计的,所以不能直接依赖自动扫描,得手动完成 View 和 ViewModel 的绑定:
// 在你的 ToolWindowPane 子类的构造函数/初始化方法里 protected override void Initialize() { base.Initialize(); // 实例化 ViewModel var viewModel = new YourToolWindowViewModel(); // 让 Caliburn 根据约定找到对应的 View var view = ViewLocator.LocateForModel(viewModel, null, null); // 手动绑定 View 和 ViewModel ViewModelBinder.Bind(viewModel, view, null); // 将绑定后的 View 设置为 ToolWindowPane 的内容 this.Content = view; }
2. 调整 Bootstrapper 的初始化时机
不要等到 ToolWindowPane 初始化后才启动 Bootstrapper,应该把 Bootstrapper 的初始化放在扩展的入口 Package 类的 Initialize 方法里——这是 VS 扩展启动的最早时机之一,能确保 Caliburn 的服务提前就绪:
// 你的 Package 子类 [PackageRegistration(UseManagedResourcesOnly = true)] [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid("你的PackageGUID")] public sealed class YourExtensionPackage : Package { protected override void Initialize() { base.Initialize(); // 初始化自定义 Bootstrapper new YourBootstrapper().Initialize(); } }
同时,Bootstrapper 的 Configure 方法要正确注册服务,比如适配 VS 的环境(如果用 MEF 的话,要和 VS 的 MEF 容器兼容,或者用 Caliburn 自带的 SimpleContainer):
public class YourBootstrapper : BootstrapperBase { private SimpleContainer _container; public YourBootstrapper() { Initialize(); } protected override void Configure() { _container = new SimpleContainer(); // 注册 Caliburn 核心服务 _container.Singleton<IWindowManager, WindowManager>(); _container.Singleton<IEventAggregator, EventAggregator>(); // 注册你的 ViewModel _container.PerRequest<YourToolWindowViewModel>(); } protected override object GetInstance(Type service, string key) { return _container.GetInstance(service, key); } protected override IEnumerable<object> GetAllInstances(Type service) { return _container.GetAllInstances(service); } protected override void BuildUp(object instance) { _container.BuildUp(instance); } }
3. 检查并修正命名约定
确保你的 View 和 ViewModel 符合 Caliburn 的默认命名规则:
- ViewModel 命名为
XXXViewModel,对应的 View 命名为XXXView - 两者最好放在同一个命名空间下,或者手动配置
ViewLocator的命名转换规则:
// 在 Bootstrapper 的 Configure 方法里添加 ViewLocator.NameTransformer.AddRule( "YourExtension.ViewModels.(.*)ViewModel", "YourExtension.Views.$1View" );
4. 确保 UI 操作在主线程执行
VS 扩展的 UI 操作必须在主线程进行,如果你在非主线程初始化 View/ViewModel,可能导致绑定失效。可以用 Dispatcher 确保操作在主线程执行:
Application.Current.Dispatcher.Invoke(() => { var viewModel = new YourToolWindowViewModel(); var view = ViewLocator.LocateForModel(viewModel, null, null); ViewModelBinder.Bind(viewModel, view, null); this.Content = view; });
只要做好这些适配,Caliburn.Micro 的约定绑定、事件聚合等核心功能都能在 VS 扩展里正常工作。
内容的提问来源于stack exchange,提问作者MrTouya

