漫坊亭

社会の底辺プログラマ

Caliburn.Micro Part 1: Getting Started をやってみる。

Mindscape Blog » Blog Archive » Caliburn Micro Part 1: Getting Started manbou404.hatenablog.com

要は、Cariburn.Microを使ったソリューションの作り方
※一番簡単なのは、NuGetからCariburn.Micro.Startを使うこと!!!

Step 1: Getting Started

  1. プロジェクトの作成
    テンプレート ~ Visual C#Windowsデスクトップ ~ WPFアプリケーション

  2. ソリューションのNuGetの管理
    f:id:jfactory:20150625090740p:plain

  3. MainWindow.xamlを削除

  4. App.xamlを修正
    f:id:jfactory:20150625091623p:plain

Step 2: The View Model

  1. プロジェクトに、ShellViewModel.csを追加する。
    • 原文ではAppViewModelだが、ここではShellViewModelにしている。
// <ShellViewModel.cs>
using Caliburn.Micro;
 
namespace Tutorial
{
    public class ShellViewModel : PropertyChangedBase { }
}

Step 3: The View

  1. プロジェクトに、(WPFユーザコントロール)ShellView.xamlを追加する。
    (Backgroundを追加しただけ)
<!--ShellView.xaml>
<UserControl x:Class="Tutorial.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Background="LightBlue">
    <Grid>
            
    </Grid>
</UserControl>

Step 4: The Bootstrapper

  1. プロジェクトにAppBootstrapperクラスを追加
    これはチュートリアルの通りにならない。オブジェクトブラウザで見ても、Bootstrapper<>は存在しない。
    どこかのバージョンから、必ずコンテナを内蔵しなくてはならないようだ。
    とりあえず、以下のようにしておく
// <AppBootstrapper.cs>
using Caliburn.Micro;

namespace Tutorial
{
    // public class AppBootstrapper : Bootstrapper<AppViewModel> <-- ビルドできない
    public class AppBootstrapper : BootstrapperBase
    {
    }
}
  1. App.xamlに以下のように修正 (local名前空間と、Application.Resources)
<!--App.xaml>
<Application x:Class="Example.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:local="clr-namespace:Tutorial"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:AppBootstrapper x:Key="bootstrapper" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Step 5: 今のバージョンに合うように改造する

(といってもCariburn.Micro.Startの通りにするだけ)
ビルドでエラーが出ないことを確認しておく。実行しても、なにも起きないけど。。。

  1. プロジェクトにIShell.csを追加
// <IShell.cs>
namespace Tutorial
{
    interface IShell { }
}
  1. ShellViewModel.csにIShellを追加
// <ShellViewModel.cs>
using Caliburn.Micro;

namespace Tutorial
{                                                    // ↓↓↓
    public class ShellViewModel  : PropertyChangedBase, IShell
    {
    }
}
  1. AppBootstrapper.csの中身を実装
// <AppBootstrapper.cs>
using System;
using System.Collections.Generic;
using Caliburn.Micro;

namespace Tutorial
{
    // public class AppBootstrapper : Bootstrapper<AppViewModel>  <--ダメよ
    public class AppBootstrapper : BootstrapperBase
    {
        SimpleContainer container;

        public AppBootstrapper()
        {
            Initialize();
        }

        protected override void Configure()
        {
            container = new SimpleContainer();

            container.Singleton<IWindowManager, WindowManager>();
            container.Singleton<IEventAggregator, EventAggregator>();
            container.PerRequest<IShell, ShellViewModel>();
        }

        protected override object GetInstance(Type service, string key)
        {
            var instance = container.GetInstance(service, key);
            if (instance != null)
                return instance;

            throw new InvalidOperationException("Could not locate any instances.");
        }

        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return container.GetAllInstances(service);
        }

        protected override void BuildUp(object instance)
        {
            container.BuildUp(instance);
        }

        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        {
            DisplayRootViewFor<IShell>();
        }
    }
}
  1. 実行してみる
    f:id:jfactory:20150625102710p:plain
    ん~~!?なんか小さいぞ??

    Cariburn.Micro.Startを入れたプロジェクトを見て、ShellViewを同じにしてみる

<!--ShellView.xaml-->
<UserControl x:Class="Tutorial.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    <Grid>
        <TextBlock Text="Hello Caliburn Micro!"
                   VerticalAlignment="Center"
                   HorizontalAlignment="Center"
                   FontSize="20" />
    </Grid>
</UserControl>

やっぱり小さい・・・
f:id:jfactory:20150625103359p:plain>

サイズを指定してみる

<UserControl x:Class="Tutorial.ShellView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Width="300" Height="300" Background="LightBlue">

そうそう、こうなって欲しかった
f:id:jfactory:20150625104022p:plain

サイズ未指定の時の挙動がCariburn.Micro.Startと違うのが気になるが・・・

ソース一式