漫坊亭

社会の底辺プログラマ

(自分用翻訳) Caliburn Micro Part 5: The Window Manager

原文へのリンク (google翻訳を使用しています)

こんにちは、再び私たちのCaliburnMicroチュートリアルシリーズの次の投稿へようこそ。比較的簡単なチュートリアル、我々はウィンドウマネージャーを見てされますこの時間。私たちは始める前に、ここでこのシリーズの前回のチュートリアルへのリンクは次のとおりです。

Part 1: Getting Started
Part 2: Data Binding and Events
Part 3: More About Events and Parameters
Part 4: The Event Aggregator

知ってますCaliburnMicroの周り果たしているあなた方の多くは、そこに多くのウィンドウ·マネージャについては言及されていません。このため、私はウィンドウ·マネージャについてのすべてをカバーすることはありません、私は単に私がそれについて知っていることを説明します。ウィンドウマネージャを使用する方法を示すために、我々は、このシリーズの最初のブログ投稿で行われたアプリケーションを拡張されます。

Using a Window Manager

あなたは、私たちが行った最初のものの一つはプロジェクトからMainWindow.xamlを削除したことをはじめたブログ記事から覚えていることがあります。CaliburnMicroは、ウィンドウの初期化、そのデータコンテキストを設定し、私たちのために適切なビューを表示してくれます。ウィンドウマネージャは、これが行わ取得するための責任のメカニズムの一つです。あなたがCaliburnMicroで構築されたアプリケーションを実行すると、ウィンドウ·マネージャが自動的に起動画面を作成するために使用されます。小規模なアプリケーションの場合、これはあなたが本当にウィンドウマネージャを知るために必要なすべてです。あなたが他のウィンドウやダイアログを表示する必要がある大規模なアプリケーションを構築する際には、ウィンドウマネージャを使用する方法を学ぶための時間です。これを実証するために、我々は、クリックすると新しいウィンドウが開きますアプリケーションにボタンを追加します。

AppView.xamlにボタンを追加し、AppViewModel.csのメソッドへのclickイベントをフックすることで起動します。前のチュートリアルで説明したように、この使用してCaliburnMicro規則を行うことができます。私は、このメソッド「OpenWindow」と呼ばれています。 OpenWindow方法では、ウィンドウ·マネージャのインスタンスへのアクセスを必要としています。我々は、単にウィンドウマネージャの新しいインスタンスを作成し、それを使用することもできますが、それはCaliburnMicroがアプリケーションに提供するグローバルウィンドウマネージャインスタンスのホールドを取得することをお勧めします。我々はIWindowManagerに取り、フィールドに格納AppViewModel.csのコンストラクタを作成することで行います。あなたは、少なくとも1のパラメータを持つビューモデルのコンストラクターを作成するときに何をすべきかのこのブログシリーズの一部4から覚えていることがあります。ここでは3つの簡単なステップで要約は次のとおりです。

  1. 次のようにブートストラップを更新します。プロジェクトの参照として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));
  }
}
  1. AppViewModelクラスのエクスポート属性を使用します。
[Export(typeof(AppViewModel))]
public class AppViewModel : PropertyChangedBase
{
  ...
}
  1. AppViewModelのコンストラクタImportingConstructor属性を使用します。
private readonly IWindowManager _windowManager;
 
[ImportingConstructor]
public AppViewModel(IWindowManager windowManager)
{
  _windowManager = windowManager;
}

今、私たちは、新しいウィンドウを開くために、私たちのOpenWindow方法でウィンドウマネージャのインスタンスを使用することができます。このチュートリアルシンプルに保つために、我々は単純に、データコンテキストとしてAppViewModelを使用して新しいウィンドウを作成します。これは、次のコードを使用して行われます。

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

これを実行し、別のウィンドウが表示される確認するには、ボタンを押してください。私たちが行うために必要なすべては、ウィンドウのインスタンスを作成し、私たちのビューモデルのための適切なビューを表示から他のすべてが私たちのために行われるビューモデルのインスタンスを渡しました。もう一度CaliburnMicroは簡単に私たちの生活になります!

f:id:jfactory:20150621215830p:plain

ウィンドウマネージャはウィンドウ、ダイアログやポップアップを開くための方法およびメソッドオーバーロードのすべての種類を持っています。すべてのこれらの方法はかなり単純で使いやすいです。あなたはCaliburnMicroが付属していますHelloWindowManagerサンプル中のウィンドウマネージャのより多くの使用状況を見ることができます。私が見てみたかったもう一つは、「設定」のパラメータです。ここでは、新しいウィンドウのプロパティを設定するために使用される動的オブジェクトを渡すことができます。これは、あなたがそれを必要とする場合、アプリケーションの外観にきめ細かく制御を提供します。ここで私は、手動ではなくセンターオーナー以外であることがWindowStartupLocationを設定していた例です。

public void OpenWindow()
{
  dynamic settings = new ExpandoObject();
  settings.WindowStartupLocation = WindowStartupLocation.Manual;
 
  _windowManager.ShowWindow(new AppViewModel(_windowManager), null, settings);
}

Custom Window Managers

それがカスタムウィンドウマネージャを実装するのに有用である場合のシナリオがあります。あなたは一般的な値であることを、すべてのウィンドウのインスタンスにプロパティを設定する必要がある場合、これは良いです。例えば、特性は、アイコン、ウィンドウ状態、ウィンドウのサイズと適用するカスタムクロムを含むことができます。私はWindows上で設定することが分かった中で最も有用な特性はSizeToContentプロパティです。デフォルトでは、CaliburnMicroはこれがSizeToContent.WidthAndHeightに設定します。これは、ウィンドウが自動的にその内容に基づいて、それ自体のサイズことを意味します。これは時間に便利なことができますが、私は特定のアプリケーションレイアウトでいくつかの問題を引き起こすことがこれを発見したと、ウィンドウがデフォルトで最大化されるように設定する際にバグがあると思われます。カスタムウィンドウマネージャの作成は非常に簡単です。ウィンドウマネージャを拡張するクラスを追加することで起動します。次に、あなたは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にウィンドウマネージャのインスタンスを追加している見ることができます。あなたはこのようになり代わりにカスタムウィンドウマネージャのインスタンスを使用するためにこれを置き換えることができます。

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

それは私がウィンドウマネージャでカバーしたかったすべてのものだ、私はあなたがCaliburnMicroによって供給素晴らしいWPFアプリケーションを構築する上で、それが有用であることが判明願っています!私は、一連のあなたのコメントやフィードバックに感謝します! このチュートリアルの完全なのVisual Studio2010のプロジェクトをダウンロードしてください。

次回は私はあなたの画面や導体の紹介を与えるでしょう。