SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――ラジオボタンとチェックボックス機能

(3) RadioButtonコントロールとCheckBoxコントロール

ダウンロード WPF_VB.zip (1.6 MB)
ダウンロード WPF_CS.zip (707.4 KB)
ダウンロード Silverlight_VB.zip (4.8 MB)
ダウンロード Silverlight_CS.zip (4.7 MB)

5. コンテントにイメージを使用する

 コンテントはチェックマークの右側に表示されれる部分です。通常テキストが表示されますがイメージを表示することもできます。

 下記はテキストの代わりにイメージを設定する例です。CheckBoxの要素にImage要素を入れてイメージを表示しています。

コンテントにイメージを表示する例
コンテントにイメージを表示する例
XAMLの例
<StackPanel Orientation="Vertical">
    <TextBlock Text="好きな果物を選択してください" FontSize="14" />
    <StackPanel Orientation="Horizontal">        
        <CheckBox Name="CheckBox1" VerticalAlignment="Top" Margin="10,0,0,0"               
                  Height="Auto" Width="Auto">
            <Image Source="/Images/Apple.png" Width="100" Height="100" Stretch="Fill" />
        </CheckBox>
        <CheckBox Name="CheckBox2" VerticalAlignment="Top"                  
                  Height="Auto" Width="Auto">
            <Image Source="/Images/Banana.png" Width="100" Height="100" Stretch="Fill" />
        </CheckBox>
        <CheckBox Name="CheckBox3" VerticalAlignment="Top"                  
                  Height="Auto" Width="Auto">
            <Image Source="/Images/Orange.png" Width="100" Height="100" Stretch="Fill" />
        </CheckBox>
    </StackPanel>
</StackPanel>
ポイント

 コンテントにイメージを表示するにはCheckBox要素にImage要素を使用する。

6. チェックマークにイメージを使用する

 チェックマークにイメージを使用するには、CheckBoxコントロールのControlTempleateを変更します。

 WPFとSilverlightでは書き方が異なります。最初にWPFの方を説明します。

 WPFではBulletDecorator要素でチェックマークのイメージを指定します。また、ContentPresenter要素を入れることで、チェックマークの隣に表示されるコンテント部分を作成します。BulletDecoratorで設定したイメージはチェック状態オフの時のイメージになります。

 チェック状態がオンおよび未確定のイメージは、ControlTemplate.Triggers要素Trigger要素で設定します。

 Triggerはアクションに対応するプロパティ値を設定するためのもので、チェック状態が変更された(IsCheckedがTrueやNullになったとき)というアクションに対するイメージを設定します。

 以上を踏まえて、チェックマークにイメージを設定した例を下記に示します。オンのときは○、オフのときは×、未確定のときは△のイメージを表示します。

チェックマークにイメージを使用する例
チェックマークにイメージを使用する例
XAMLの例
<Window.Resources>
    <Style TargetType="{x:Type CheckBox}">
        <Setter Property="Template">                
            <Setter.Value>
                <ControlTemplate TargetType="CheckBox">
                    <BulletDecorator>
                        <BulletDecorator.Bullet>
                            <!--オフ状態のイメージ-->
                            <Image Name="TickImage" Source="Images\Christcross.png" Grid.Column="0"/>      
                        </BulletDecorator.Bullet>
                        <ContentPresenter VerticalAlignment="Center" Grid.Column="1"/>
                    </BulletDecorator>
                    <ControlTemplate.Triggers>
                        <!--オン状態のイメージ-->
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="TickImage" Property="Source" Value="Images\Circle.png" />
                        </Trigger>
                        <!--未確定状態のイメージ-->
                        <Trigger Property="IsChecked" Value="{x:Null}">
                            <Setter TargetName="TickImage" Property="Source" Value="Images\Triangle.png" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <CheckBox IsThreeState="True" Name="CheckBox1" VerticalAlignment="Top" 
              Content="CheckBox1" IsChecked="True" />
    <CheckBox IsThreeState="True" Name="CheckBox2" VerticalAlignment="Top" 
              Content="CheckBox2" IsChecked="False" />
    <CheckBox IsThreeState="True" Name="CheckBox3" VerticalAlignment="Top" 
              Content="CheckBox3" IsChecked="{x:Null}" />
</Grid>

 次にSilverlightの説明をします。

 SilverlightもCheckBoxコントロールのControlTemplateを変更します。ただし、こちらはVisualStateManager要素を使用します。

 最初に、ControlTemplate内にGridを配置して、チェックマーク部分とコンテント部分とに分かれるように列を2つ作ります。

 次に、VisualStateManager.VisualStateGropups要素Storyboard要素でコントロールの外観がどのように変化するのかを設定します。

 ここでは、チェックの状態がオン/オフ/未確定のときのそれぞれのイメージ不透明度が変わるように設定しています。これにより各チェック状態の時にイメージが切り替わるようにしています。

 下記にSilverlightでのXAML例を示します。

XAMLの例
<Grid.Resources>
    <Style x:Key="CheckBoxStyle" TargetType="CheckBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CheckBox">              
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="20"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CheckStates">
                                <VisualState x:Name="Checked">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="1" 
                                            Storyboard.TargetProperty="(UIElement.Opacity)" 
                                            Storyboard.TargetName="CheckIcon"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unchecked">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="1" 
                                            Storyboard.TargetProperty="(UIElement.Opacity)" 
                                            Storyboard.TargetName="UncheckIcon"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Indeterminate">
                                    <Storyboard>
                                        <DoubleAnimation Duration="0" To="1" 
                                            Storyboard.TargetProperty="(UIElement.Opacity)" 
                                            Storyboard.TargetName="IndeterminateIcon"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Grid HorizontalAlignment="Left" VerticalAlignment="Center">
                            <Image x:Name="CheckIcon" 
                            Source="../Images/Circle.png" Opacity="0" Stretch="Fill" />
                            <Image x:Name="UncheckIcon" 
                            Source="../Images/Christcross.png" Opacity="0" Stretch="Fill" />
                            <Image x:Name="IndeterminateIcon" 
                            Source="../Images/Triangle.png" Opacity="0" Stretch="Fill" />
                        </Grid>

                        <ContentPresenter x:Name="contentPresenter" 
                                      ContentTemplate="{TemplateBinding ContentTemplate}" 
                                      Content="{TemplateBinding Content}" Grid.Column="1" 
                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                      Margin="{TemplateBinding Padding}" 
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Grid.Resources>

<sdk:Label Content="06.チェックマークにイメージを使用する" />
<CheckBox Content="CheckBox" Name="CheckBox1" Style="{StaticResource CheckBoxStyle}" IsThreeState="True">
    <CheckBox.RenderTransform>
        <ScaleTransform CenterX=".5" CenterY=".5" ScaleX="1.5" ScaleY="1.5"/>
    </CheckBox.RenderTransform>
</CheckBox>

ポイント

 WPFでチェックマークにイメージを使用する場合はBulletDecorator要素とTrigger要素を使用する。

 SilverlightはVisualStateManagerとStoryBoard要素を使用する。

次のページ
RadioButtonコントロール編

この記事は参考になりましたか?

Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5507 2010/10/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー