かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

マークアップ拡張を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)