Caliburn Micro 第五部分 : 窗体管理

http://www.mindscapehq.com/blog/index.php/2012/03/13/caliburn-micro-part-5-the-window-manager/


使用窗体管理

你可能还记得,在教程的最开始,我们删除了项目中的 MainWindow.xaml 文件。 Caliburn Micro 接管了初始化窗体、设置窗体数据上下文和展示特定视图的任务。窗体管理机制是实现该功能的保障。当你使用 Caliburn Micro 的时候,窗体管理会自动创建开始窗体。

下面是使用的简单的三个步骤

  1. 更新 bootstrper 文件

    using Caliburn.Micro;
    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using System.ComponentModel.Composition.Primitives;
    
    public class AppBootstrapper : Bootstrapper<AppViewModel>
    {
      private CompositionContainer container;
    
      protected override void Configure()
      {
        container = new CompositionContainer(new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
    
        CompositionBatch batch = new CompositionBatch();
    
        batch.AddExportedValue<IWindowManager>(new WindowManager());
        batch.AddExportedValue<IEventAggregator>(new EventAggregator());
        batch.AddExportedValue(container);
    
        container.Compose(batch);
      }
    
      protected override object GetInstance(Type serviceType, string key)
      {
        string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
        var exports = container.GetExportedValues<object>(contract);
    
        if (exports.Count() > 0)
        {
          return exports.First();
        }
    
        throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
      }
    }
    
  2. 在 ViewModel 类上使用 Export 特性

    [Export(typeof(AppViewModel))]
    public class AppViewModel : PropertyChangedBase
    {
      ...
    }
    
  3. 在 ViewModel 的构造函数上使用 ImportingConstructor 特性

    private readonly IWindowManager _windowManager;
    
    [ImportingConstructor]
    public AppViewModel(IWindowManager windowManager)
    {
      _windowManager = windowManager;
    }
    

使用

public void OpenWindow()
{
  _windowManager.ShowWindow(new AppViewModel(_windowManager));
}

自定义窗体参数

public void OpenWindow()
{
  dynamic settings = new ExpandoObject();
  settings.WindowStartupLocation = WindowStartupLocation.Manual;

  _windowManager.ShowWindow(new AppViewModel(_windowManager), null, settings);
}

自定义窗体管理

有很多时候自定义窗体管理是很有用的,比如在你需要给所有的窗体实例设置属性。

protected override Window EnsureWindow(object model, object view, bool isDialog)
{
  Window window = base.EnsureWindow(model, view, isDialog);

  window.SizeToContent = SizeToContent.Manual;

  return window;
}

batch.AddExportedValue<IWindowManager>(new AppWindowManager());

知识共享许可协议
《Caliburn Micro 第五部分 : 窗体管理》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: zip: Unable to initialize module Module compiled with module API=20060613 PHP compiled with module API=20090626 These options need to match

Filename: Unknown

Line Number: 0

Backtrace: