zoukankan      html  css  js  c++  java
  • Caliburn.Micro 杰的入门教程5,Window Manager 窗口管理器

    Caliburn.Micro 杰的入门教程1(翻译)
    Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)
    Caliburn.Micro 杰的入门教程3,事件和参数
    Caliburn.Micro 杰的入门教程4,事件聚合器
    Caliburn.Micro 杰的入门教程5,窗口管理器
    Caliburn.Micro 杰的入门教程6, Screens 和 Conductors 简介


     Caliburn Micro Part 5: The Window Manager

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


     你们中许多人在啃Caliburn Micro的时候,会发现没有太多提及到窗口管理器。出于这个原因,我会简单地解释一下我了解的东西,我不会涵盖一切。

    为了演示如何使用窗口管理器,我们将扩展我们在本系列的第一篇博客。

    1.Using a Window Manager

    你可能还记得在入门的博客文章说的,我们做的第一件事就是从项目中删除MainWindow.xaml 。 Caliburn Micro需要初始化窗口,设置它的data context(数据上下文)和给我们显示相应的视图。窗口管理器就是有效的处理它们的机制之一。
    当您运行构建Caliburn Micro应用程序,窗口管理器被自动用于创建启动窗口。对于小型的应用程序,对窗口管理器只需要了解这些就行。当你正在构建需要显示其他窗口或对话框等较大的应用程序时,就是时候来学习如何使用窗口管理器了。
    为了证明这一点,我们将添加一个按钮,点击后,程序将打开一个新窗口。
    首先,在AppView.xaml中添加一个按钮,然后将click事件和AppViewModel.cs中的方法关联。使用Caliburn Micro约定在前面的教程中解释了你可以做到这一点。我定义方法名为“OpenWindow ” 。
    在的openWindow方法中,我们将需要访问窗口管理器的一个实例。虽然我们可以简单地创建新窗口,而不使用窗口管理器,但是这是最好的做法,用来获取Caliburn Micro提供给应用程序的,保持全球化的窗口管理器实例。我们可以通过在AppViewModel.cs构造函数中,添加一个IWindowManager并将其存储在一个字段上,来做到这一点。你可能还记得这个博客系列的第4部分,当你在一个ViewModel创建一个构造函数时,至少要有1个参数。
    下面是3个简单的步骤回顾一下:

    1。更新bootstrapper引导程序如下。记得添加System.ComponentModel.Composition。dll引用。

    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. 在 AppViewModel 类中,添加”Export“特性: 

    [Export(typeof(AppViewModel))]
    public class AppViewModel : PropertyChangedBase
    {
      ...
    }

    3. 在 AppViewModel 类中,为构造函数添加 ”ImportingConstructor“特性:

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

    现在我们可以使用Window Manager实例在我们的openWindow方法来打开一个新窗口。为了保持本教程的简单,我们将简单地创建也使用AppViewModel作为新窗口的data context数据上下文。使用下面的代码来完成的:

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

    现在运行一下,然后按下按钮,会看到另一个窗口出现。
    所有我们需要做的是通过传递一个ViewModel的一个实例。然后从创建窗口实例,到为我们显示ViewModel相应的View的一切,都会完成。Caliburn Micro再次使我们的生活更轻松!

    Window Manager有各种各样的方法和方法重载打开窗口,对话框和弹出窗口。所有这些方法是相当直截了当的,易于使用。
    你可以在 Caliburn Micro 自带的 HelloWindowManager 示例中,看到WindowManager窗口管理器的更多用法。
    还有一件事,我想看看'settings'参数。在这里,你可以传递dynamic类型的动态对象来给新的窗口中设置属性。这能更好的使您根据您的需要,更细的控制您的应用程序。
    下面是一个例子,我设置了WindowStartupLocation为 manual 而不是 center-owner

    2.Custom Window Managers

     有些情况下,实现自定义的窗口管理器是有用的。如果你需要在所有窗口实例中设置属性都是一样的值,用它就很好。例如,属性可能包括icon图标,窗口状态,窗口大小和自定义程序样式。我发现在Windows中最常设置的属性是“SizeToContent”。默认情况下,Caliburn Micro是设置SizeToContent.WidthAndHeight。这意味着该窗口根据它的内容自动调整自身大小。虽然有时可以方便的这样做,但我发现这会导致一些问题:
    某些应用程序的布局和设置窗口时,默认情况下最大化会导致越界。
    创建一个自定义的窗口管理器是非常简单的。首先添加一个继承于“WindowManager”的类,接下来,可以重写“EnsureWindow”方法,做一些类似如下:

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

    在这个方法中,我们首先通过调用base.EnsureWindow()来创建窗口实例。接下来,你可以设置一下你想要的窗口中的属性,然后简单地返回窗口实例。最后一步是设置自定义的窗口管理器,以在全球范围内使用的应用程序的实例。在这篇博客文章的第一个代码片段,我们进行修改引导程序。在这里,你可以看到我们给“CompositionBatch”添加了一个WindowManager实例。您可以添加一个和下面的实例类似的,自定义的窗口管理器的实例:

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

    这就是我想要的一切,来使用窗口管理器,我希望你觉得它在构建Caliburn Micro的WPF应用程序很有用!
    本教程源码下载
    好了,写你的代码吧:)

  • 相关阅读:
    【CODEVS1380】没有上司的舞会
    【poj2248】Addition Chains
    【poj3070】Fibonacci
    【NOIP2006】开心的金明
    【Tyvj1359】收入计划
    【NOIP2015】跳石头
    【CODEVS1219】骑士游历
    暑假假期总结第六周
    暑假假期总结第五周
    暑假假期总结第四周
  • 原文地址:https://www.cnblogs.com/3Tai/p/3485264.html
Copyright © 2011-2022 走看看