しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

WebMatrix 2 の拡張機能を作成する (2) - IExtension と MEF

さて、前回でプロジェクトまで作成できたので、とりあえずプロジェクトの中身を確認しておきます。

上から順番に見ていきましょう。

まずは DelegateCommand ですが、これは MVVM やったことのある人ならみんな知ってると思います。WebMatrix は WPF で作られている関係もあり、ボタンやメニューが選択されたことを通知するために ICommand インターフェースが使われています。DelegateCommand は I。Command を実装していて、コンストラクタで渡したラムダ式やデリゲートを実行する機能を持っています。

そして Star_16x16.png と Star_32x32.png はアイコン画像です。主にボタンとコンテキストメニューで使います。

最後は WebMatrixExtension になりますが、これが拡張機能の心臓部ともいえる IExtension インターフェースを実装しているクラスです。実際には IExtension をそのまま実装しているわけではなく、予め用意されている ExtensionBase クラスを継承しています。

それでは生成されているコードを見ていきます。

/// <summary>
/// A sample WebMatrix extension.
/// </summary>
[Export(typeof(IExtension))]
public class WebMatrixExtension2 : ExtensionBase
{
    // 省略
}

まずはクラス宣言です。MEF を使っているので Export 属性を使って IExtension 型として外部に公開するようにしています。ExtensionBase を継承していることもわかりますね。

/// <summary>
/// Initializes a new instance of the WebMatrixExtension2 class.
/// </summary>
public WebMatrixExtension2()
    : base("WebMatrixExtension2", "1.0")
{
    // Add a simple button to the Ribbon
    RibbonItemsCollection.Add(
        new RibbonGroup(
            "My Group",
            new IRibbonItem[]
            {
                new RibbonButton(
                    "My Button",
                    new DelegateCommand(HandleRibbonButtonInvoke),
                    null,
                    _starImageSmall,
                    _starImageLarge)
            }));
}

次はコンストラクタです。ExtensionBase クラスが引数付きのコンストラクタを持っているので、コンストラクタでパラメータ付きで呼び出してあげましょう。パラメータとして拡張機能の名前とバージョンを指定します。

ここで指定した名前はこの後に紹介予定のダイアログやリボン UI でのタイトルなどのデフォルト値として使われます。

そして肝心の処理としては、ここではリボン UI にグループとボタンを追加しています。リボン UI の操作方法は別で説明しますので、今回はボタンを追加しているということだけ理解していただければ問題ありません。そしてボタンが押された時には DelegateCommand を使って HandleRibbonButtonInvoke メソッドへ処理を委譲しています。

/// <summary>
/// Called when the Ribbon button is invoked.
/// </summary>
/// <param name="parameter">Unused.</param>
private void HandleRibbonButtonInvoke(object parameter)
{
    if (WebMatrixHost.ShowDialog(this.Name, "Open a browser window for the site?").GetValueOrDefault())
    {
        Process.Start(WebMatrixHost.WebSite.Uri.AbsoluteUri);
    }
}

最後にボタンが押された時の処理を実装している HandleRibbonButtonInvoke メソッドです。処理としてはダイアログを表示して「OK」が選択された場合に開いているウェブサイトをブラウザで表示するといったことをしています。

ここで注目してもらいたいのが WebMatrixHost というプロパティです。これは WebMatrix の本体機能にアクセスするために用意されていて、ダイアログの表示やウェブサイト・ワークスペースなど各種情報の取得が行えます。

ちなみに WebMatrixHost プロパティは ExtensionBase クラスで用意されているものなので、使用しない場合には IWebMatrixHost インターフェースをインポートして取得する必要があります。

[Import(typeof(IWebMatrixHost))]
private IWebMatrixHost WebMatrixHost { get; set; }

他にも Import 属性を使ってインスタンスを取得できるインターフェースは多く存在しますが、基本的に ExtensionBase クラスに用意されているプロパティで十分です。

今回見たコードはテンプレートですが、基本的にはリボン UI やコンテキストメニューにボタンを追加して処理を実行するのが WebMatrix の拡張機能の考え方です。他にもプロパティやイベントなどがありますが、それは次回以降に紹介していきたいと思います。お疲れ様でした。