Composite Application GuidanceのFeb-2009でSilverlight2に対応しています。
ということでHello worldを作ってどんなものか確認してみようと思います。
Composite Application Guidance for Silverlightをコンパイルしよう
ダウンロードしたファイルからDesktop & Silverlight - Open Composite Application Library.batをダブルクリックして、プロジェクトを開きます。
うちで使ってるのはVS2008 stdなので、テストプロジェクトに対応していないので、その旨をあらわすエラーが出るけど気にしないでOKを押してれば開けます。
職場でVisual Web Developer 2008を使っても開けたので、VWDでも大丈夫です。
んでソリューションをビルドすると、Composite.UnityExtensionsプロジェクトのBinフォルダの下にdllがいくつか作られます。
その中から、以下の5つのDLLだけ抜き出してとっておきます。
プロジェクトの作成
準備が出来たので、Hello world用のプロジェクトを作成します。
「CompositeSilverlight-HelloWorld」という名前でSilverlightアプリケーションを新規作成します。
ソリューションフォルダ直下にLibraryというフォルダを作って、そこに、さっき作ったDLLをコピーしておきます。
コピーしたDLLをプロジェクトの参照に追加します。
ShellとかBootstrapperとか
次にお約束の手順をふんでComposite Application Guidanceっぽいつくりにしていきます。
まず、Page.xamlをさくっと削除してShellという名前のユーザーコントロールを作成します。
次に、UnityBootstrapperを継承したBootstrapperクラスを作成します。ここらへんは、ほとんどWPFのときと同じ感覚で出来ます。
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
// コンテナからシェルのインスタンスを取得
var shell = Container.Resolve<Shell>();
// SilverlightはApplicationのRootVisualに追加した
// ユーザコントロールが表示される。
Application.Current.RootVisual = shell;
return shell;
}
protected override IModuleCatalog GetModuleCatalog()
{
// まだモジュールは無い
return new ModuleCatalog();
}
}
そして、App.xaml.csのStartupイベントでBootstrapperを起動するようにします。
private void Application_Startup(object sender, StartupEventArgs e)
{
var bootstrapper = new Bootstrapper();
bootstrapper.Run();
}
以上で、何も無いアプリケーションは起動します。
一応起動してコンパイルエラーや変なエラーが出ないか確認します。
何も表示されません。
最後に、ContentControlを追加してRegionNameを定義しておきます。
ここに、モジュールで追加したユーザコントロールを表示されるようにします。
<UserControl x:Class="CompositeSilverlight_HelloWorld.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Regions="clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation">
<ContentControl Regions:RegionManager.RegionName="MainRegion" />
</UserControl>
ここら辺もWPFのときと変わらない感じに出来る。
モジュールの作成
次にモジュールを作成します。
Silverlight用のクラスライブラリプロジェクトを作成して、Composite Application GuidanceのDLLを参照に追加します。
次に、「GreetView」という名前でユーザコントロールを作成します。TextBlockやTextBoxやButtonを使って画面を作ります。
<UserControl x:Class="CompositeSilverlight_Module.GreetView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBlock Text="名前:" />
<TextBox Width="200" />
<Button Content="挨拶" />
<TextBlock />
</StackPanel>
</UserControl>
とりあえず、動きはつけてない状態で、これをShellにあてこんでみます。
HelloWorldModuleという名前のクラスを作ってIModuleインターフェースを実装します。
IRegionManagerとIUnityContainerを使うのでDependency属性をつけたプロパティも定義しておきます。そして、InitializeメソッドでMainRegionにGreetViewを登録します。
public class HelloWorldModule : IModule
{
// UnityContainerにインスタンスを登録してもらう
[Dependency]
public IUnityContainer Container { get; set; }
[Dependency]
public IRegionManager RegionManager { get; set; }
public void Initialize()
{
// MainRegionにGreetViewを登録する
RegionManager.RegisterViewWithRegion(
"MainRegion",
() => Container.Resolve<GreetView>());
}
}
ここまで出来たら、「CompositeSilverlight-HelloWorld」プロジェクトに「CompositeSilverlight-Module」の参照を追加します。
そして、BootstrapperのGetModuleCatalogメソッドにHelloWorldModule登録のコードを追加します。
protected override IModuleCatalog GetModuleCatalog()
{
// HelloWorldModuleを追加
return new ModuleCatalog()
.AddModule(typeof(HelloWorldModule));
}
これで、実行すると画面が表示されます。
動きは、まだ何もありません。
Commandを使ってみよう
とりあえず、このアプリに動きをつけてみようと思います。
まずは、普通と同じようにINotifyPropertyChangedを実装してNameをMessageプロパティを定義したGreetModelクラスを作成します。
public class GreetModel : INotifyPropertyChanged
{
#region INotifyPropertyChanged メンバ
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
var h = PropertyChanged;
if (h != null) h(this, new PropertyChangedEventArgs(name));
}
#endregion
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name == value) return;
_name = value;
OnPropertyChanged("Name");
}
}
private string _message;
public string Message
{
get { return _message; }
set
{
if (_message == value) return;
_message = value;
OnPropertyChanged("Message");
}
}
}
そして、こんにちは[入力された名前]さん!とメッセージを作るGreetメソッドを定義して、それを実行するDelegateCommand<T>を定義します。
// 挨拶を作成する
public void Greet()
{
this.Message = string.Format("こんにちは{0}さん", this.Name);
}
// メッセージ作成用コマンド
public ICommand CreateMessage { get; private set; }
public GreetModel()
{
// コマンド初期化
CreateMessage = new DelegateCommand<object>(
param => Greet());
}
後はGreetViewでBindingをします。
<UserControl x:Class="CompositeSilverlight_Module.GreetView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:Commands="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<TextBlock Text="名前:" />
<TextBox Width="200" Text="{Binding Name, Mode=TwoWay}"/>
<Button Content="挨拶" Commands:Click.Command="{Binding CreateMessage}" />
<TextBlock Text="{Binding Message, Mode=TwoWay}"/>
</StackPanel>
</UserControl>
このXAMLのポイントは、Commandを使用している部分です。
これがあれば、Silverlightでもコマンドが使えます。
そして、最後にGreetViewとGreetModelを紐付ける処理をModuleに書きます。
public class HelloWorldModule : IModule
{
// UnityContainerにインスタンスを登録してもらう
[Dependency]
public IUnityContainer Container { get; set; }
[Dependency]
public IRegionManager RegionManager { get; set; }
public void Initialize()
{
// MainRegionにGreetViewを登録する
Container.RegisterType<GreetModel>();
RegionManager.RegisterViewWithRegion(
"MainRegion",
() => Container.Resolve<GreetView>());
}
}
これで実行すると、HelloWorldが恐らく動きます。
WPFのComposite Application Guidanと、ほぼ同じのりで作れる。
すばらしい。