かずきのBlog@hatena

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

マークアップ拡張をSilverlight 5 betaで作ってみる

Silverlight 5 betaでマークアップ拡張が追加されました。ということで大分昔にWPFで書いたマークアップ拡張のハローワールドをSilverlightでもやってみようと思います。

ということで、SLMarkupExtensionと言う名前でSilverlightApplicationを新規作成します。ちゃんとSilverlight 5を選んでます。

WPFと同じ要領で、Hello worldを返すだけのマークアップ拡張のクラスを作ります。

namespace SLMarkupExtension
{
    using System;
    using System.Windows.Markup;

    /// <summary>
    /// MarkupExtensionから継承して〜Extensionという名前のクラスを作る。
    /// </summary>
    public class HelloWorldExtension : MarkupExtension
    {
        // ProvideValueでマークアップ拡張が返す値を組み立てる。
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            // ここではHello worldって返すだけ
            return "Hello world";
        }
    }
}

System.Windows.Markup.MarkupExtensionクラスを継承してProvideValueをメソッドでマークアップ拡張が返す値を決めます。


ということで、早速使ってみます。MainWindow.xamlにSLMarkupExtension名前空間とlocalというxml名前空間を紐づけます。そしてTextBlockのTextプロパティで先ほど作ったHelloWorldマークアップ拡張を使ってます。

<UserControl x:Class="SLMarkupExtension.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SLMarkupExtension"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <!-- 使ってみたよ〜 -->
        <TextBlock Text="{local:HelloWorld}" />
    </Grid>
</UserControl>

残念ながら自作マークアップ拡張にはインテリセンス効きませんでした・・・。

ここまで出来たら実行します!!!

ちゃんとHello worldが表示されました。じゃぁWPFのと同じようにプロパティも指定できるのか見てみます。WPFのサンプルと同じようにPrefixプロパティをHelloWorldExtensionに追加します。

namespace SLMarkupExtension
{
    using System;
    using System.Windows.Markup;

    /// <summary>
    /// MarkupExtensionから継承して〜Extensionという名前のクラスを作る。
    /// </summary>
    public class HelloWorldExtension : MarkupExtension
    {
        // メッセージの前に表示させる文字列
        public string Prefix { get; set; }

        // ProvideValueでマークアップ拡張が返す値を組み立てる。
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            // ここではPrefix + Hello worldって返すだけ
            return this.Prefix + "Hello world";
        }
    }
}

XAML側でもPrefixを指定するようにします。マークアップ拡張のプロパティはインテリセンスが効きました。素敵。

<!-- 使ってみたよ〜 -->
<TextBlock Text="{local:HelloWorld Prefix=ぷれふぃっくす}" />

実行してみると・・・ちゃんとPrefixで指定した文字列が表示されています。

以上、簡単にですがSilverlightでのマークアップ拡張のHello worldでした。プログラムは以下からダウンロードできます。(要Silverlight 5 Beta)