かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

まとめ

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