かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

Windows ストアアプリでマークアップ拡張作りたい・・・!(作れません)

オワタ。

というのでは何なので、1つだけ残された拡張の道を歩んでみようと思います。最近まで存在を知らなかったCustomResourceというマークアップ拡張があります。こいつは、デフォルトでは動作しないかわりに、自分で独自の実装を差し込むことが出来るようになっています。やり方は以下の通り。

  • CustomXamlResourceLoaderクラスを継承したクラスを作る
  • GetResourceメソッドをオーバーライドして、状況に応じて返したい型を返すロジックを書く
  • App.xaml.csのコンストラクタで以下の処理をする
    • CustomXamlResourceLoader.Currentに自前クラスのインスタンスをつっこむ

実用的ではないですが、以下のようなCustomXamlResourceLoaderを継承したクラスを作ったとします。

using System;
using System.Collections.Generic;
using System.Text;
using Windows.UI.Xaml.Resources;

namespace App2
{
    public class MyCustomLoader : CustomXamlResourceLoader
    {
        protected override object GetResource(
            string resourceId, string objectType, string propertyName, string propertyType)
        {
            return string.Join(", ", resourceId, objectType, propertyName, propertyType);
        }
    }
}

そして、Appクラスのコンストラクタで、このMyCustomLoaderを使うように設定します。

public App()
{
    CustomXamlResourceLoader.Current = new MyCustomLoader();

    this.InitializeComponent();
    this.Suspending += this.OnSuspending;
}

あとはCustomResourceマークアップ拡張をかくだけです。適当に画面にTextBlockを置いて、Textプロパティに設定してみました。

<TextBlock Text="{CustomResource SampleCustomResource}" />

そうすると、TextBlockが以下のように表示されます。

f:id:okazuki:20140627081948p:plain

まとめ

ドキュメントにも、普通つかわんだろみたいなことが書いてあったのですが、普通使わない感じですね・・・!誰得情報でした。