かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[C#][WPF]マークアップ拡張の作り方

XAMLを書いてて、よく出てくる{StaticResource ...}や{DynamicResource ...}や{x:Type ...}のような{}で囲まれた部分。
これってどうやって作るんだろう?と思って調べてみた。

結論としてはMarkupExtentionクラスを継承して作ればOKらしい。
ということで、早速作ってみようと思う。
何事もHelloWorldからということでHelloWorldExtensionを作ってみよう。

HelloWorldExtensionという名前のクラスをさくっとつくる。
MarkupExtensionを継承すると、ProvideValueメソッドをオーバーライドしないといけない。
このメソッドで返した値が、実際にXAMLに書いたときに使われるみたいだ。ということでHello worldを返すように実装してみた。

using System;
using System.Windows.Markup;

namespace WpfMarkupExtension
{
    public class HelloWorldExtension : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return "Hello world";
        }
    }
}

早速XAMLで使ってみよう。

<Window x:Class="WpfMarkupExtension.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfMarkupExtension="clr-namespace:WpfMarkupExtension"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <!-- 使ってみたよ -->
        <TextBlock Text="{WpfMarkupExtension:HelloWorld}" />
    </Grid>
</Window>

xmlns:WpfMarkupExtension="clr-namespace:WpfMarkupExtension"で名前空間を指定してTextBlockのTextプロパティで実際に使ってみてる。これを実行するとHello worldが表示される!
image

これだけじゃつまらないのでHelloWorldExtensionにプロパティもつけてみようと思う。プロパティは、{Binding Source=..., Path=....}みたいな形でXAML内から指定できる。
これは特別なことをしなくてもよくて、普通にプロパティにすればOKみたいだ。

というわけで、HelloWorldExtensionに、Prefixというプロパティをつけてみた。

using System;
using System.Windows.Markup;

namespace WpfMarkupExtension
{
    public class HelloWorldExtension : MarkupExtension
    {
        public string Prefix { get; set; }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Prefix + "Hello world";
        }
    }
}

XAMLで使うときには↓のような感じで使える。

<Window x:Class="WpfMarkupExtension.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfMarkupExtension="clr-namespace:WpfMarkupExtension"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <!-- Prefixプロパティ!! -->
        <TextBlock Text="{WpfMarkupExtension:HelloWorld Prefix=へろー}" />
    </Grid>
</Window>

実行するとちゃんと効いてるのがわかる。
image

最後に、なんていうのかは知らないけどBindingのPathプロパティみたいに{Binding Text}って書くと{Binding Path=Text}と同じように扱われるみたいなのを作ってみようと思う。
これは、引数のあるコンストラクタを定義すればいいみたいだ。お作法的には、コンストラクタの引数で指定されるプロパティに対してConstructorArgumentもつけてあげるのがいいっぽい。(理由は不明だけど!)

そんな作法に従うと、HelloWorldExtensionは↓のようになる。

using System;
using System.Windows.Markup;

namespace WpfMarkupExtension
{
    public class HelloWorldExtension : MarkupExtension
    {
        [ConstructorArgument("prefix")]
        public string Prefix { get; set; }

        public HelloWorldExtension() { }

        public HelloWorldExtension(string prefix)
        {
            this.Prefix = prefix;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Prefix + "Hello world";
        }
    }
}

これでXAMLで使うときにはPrefix=を書かなくてもPrefixに値を指定できるようになる。

<Window x:Class="WpfMarkupExtension.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfMarkupExtension="clr-namespace:WpfMarkupExtension"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <!-- Prefixと明示的に指定しなくてもOK -->
        <TextBlock Text="{WpfMarkupExtension:HelloWorld へろー}" />
    </Grid>
</Window>

実行結果もさっきと同じようになる。
image

めでたしめでたし。

投稿日時 : 2008年3月30日 11:46

Feedback

# welded ball valve 2012/10/19 0:57 http://www.jonloovalve.com/Full-welded-ball-valve-

I like this post, enjoyed this one thanks for putting up. "To affect the quality of the day that is the art of life." by Henry David Thoreau.

# moncler sale 2012/12/07 18:59 http://2012monclerdownjacket.webs.com/

I gotta favorite this web site it seems invaluable invaluable

# Christian Louboutin Pumps 2012/12/08 5:08 http://mychristianlouboutinonline1.webs.com/

Hi my family member! I wish to say that this article is awesome, great written and include almost all significant infos. I would like to peer more posts like this.

# re: [WPF][C#]テキストボックスをフォーカスがくると全選択状態にしたい 2016/01/29 16:38 wengdongdong

20161.29wengdongdong
http://www.truereligion-outlet.net.co
http://www.michaelkorshandbags.cc
http://coach.eshopping.us.com
http://www.chiflatiron.in.net
http://www.nike-airmax.org.uk
http://www.ralphlaurenuk.me.uk
http://www.nike-airmax90.me.uk
http://www.coachoutlet-storeonline.in.net
http://www.quality-outlet.com
http://www.get-coachoutletonline.org
http://www.louboutinshoes.cc
http://www.mymichaelkorssoutlets.org
http://www.mizunorunningshoes.in.net
http://jordan.outletmalls.us.com
http://canadagoose.adsmall.us.com
http://www.basketballshoes.net.co
http://www.louisvuittonoutlets.name
http://www.toms.in.net
http://www.coach-factory-outlet-online.us.com
http://www.hermesuk.org.uk
http://www.tomsshoes.us.com
http://www.longchampoutlet.net.co
http://www.adidas-shoes.me.uk
http://www.saclongchamp-solde.fr
http://www.coachoutlet-storeonline.us.com
http://www.fitflops.us
http://www.ugg-boots-australia.com
http://www.nikefreeruns.uk
http://tiffany.outletmalls.us.com
http://www.truereligion-outlet.com
http://www.katespadeoutletsale.in.net
http://www.louisvuitton-borse.it
http://www.sac-longchamppliage.fr
http://www.michael-kors-handbags.uk
http://www.nikerosherunwomen.me.uk
http://www.canadagooseuk.me.uk
http://oakley.shopgioia.com
http://christianlouboutin.shopgioia.com
http://www.jordan13.org
http://www.michaelkorsoutletoff.in.net
http://www.chaussure-louboutin.fr
http://www.canadagooseoutlet.cc
http://www.adidas-trainers.me.uk
http://www.michael-korsuk.me.uk
http://www.michaelkors-outletonlines.in.net
http://www.coach-factoryoutlet.com.co
http://truereligion.adsmall.us.com
http://www.outlet-toms.cc
http://toms.adsmall.us.com
http://www.michaelkors-bags.me.uk
http://www.airforce1-nike.fr
http://www.oakleysunglassesfake.in.net
http://www.chaussurelouboutin-pascher.fr
http://www.nikesb.uk
http://www.vipmichaelkors-outletonline.com
http://www.nike-blazerlow.fr
http://www.rolex-replicawatches.com.co
http://www.ugg-boots-store.com
http://www.ugg-sale.in.net
http://www.jordan-femmepascher.fr
http://christianlouboutin.outletmalls.us.com
http://www.toms-outlet.cc
http://www.kate-spadeoutlet.us
http://www.mcmhandbags.name
http://www.true-religionjeans.net.co
http://www.cheap-uggsonsale.in.net
http://www.nikestoreuk.me.uk
http://www.ralph-lauren.me.uk
http://www.niketrainers.com.co
http://www.timberlanduk.me.uk
http://www.kate-spadeoutlet.com.co
http://www.sunglass-outlet.us
コメント

タイトル  
名前  
Url
コメント