チェックマークにイメージを使用するには、CheckBox コントロールのControlTempleate を変更します。
WPF と Silverlight では、書き方が異なります。
最初に WPF の方を説明します。
WPF では BulletDecorator 要素で チェックマークのイメージを指定します。また、ContentPresenter 要素を入れることで、チェックマークの隣に表示されるコンテント部分を作成します。
BulletDecoreatorで設定したイメージは、チェック状態オフの時のイメージになります。
チェック状態がオンおよび未確定のイメージは、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 FontSize="14" Width="114" Height="23" HorizontalAlignment="Left" IsThreeState="True" Margin="12,12,0,0" Name="CheckBox1" VerticalAlignment="Top"
Content="CheckBox1" IsChecked="True" />
<CheckBox FontSize="14" Width="114" Height="23" HorizontalAlignment="Left" IsThreeState="True" Margin="12,41,0,0" Name="CheckBox2" VerticalAlignment="Top"
Content="CheckBox2" IsChecked="False" />
<CheckBox FontSize="14" Width="114" Height="23" HorizontalAlignment="Left" IsThreeState="True" Margin="12,68,0,0" Name="CheckBox3" VerticalAlignment="Top"
Content="CheckBox3" IsChecked="{x:Null}" />
</Grid>
次に Silverlight の説明をします。
Silverlight も CheckeBox コントロールの 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" FlowDirection="LeftToRight" Margin="1,1,0,1.5" Opacity="0" Stretch="Fill" Height="15" Width="15" />
<Image x:Name="UncheckIcon" Source="../Images/Christcross.png" FlowDirection="LeftToRight" Margin="1,1,0,1.5" Opacity="0" Stretch="Fill" Height="15" Width="15" />
<Image x:Name="IndeterminateIcon" Source="../Images/Triangle.png" FlowDirection="LeftToRight" Margin="1,1,0,1.5" Opacity="0" Stretch="Fill" Height="15" Width="15" />
</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 Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Label1" VerticalAlignment="Top" Width="616" Content="06.チェックマークにイメージを使用する" FontSize="16" />
<CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="37,46,0,0" Name="CheckBox1" VerticalAlignment="Top" Style="{StaticResource CheckBoxStyle}" IsThreeState="True">
<CheckBox.RenderTransform>
<ScaleTransform CenterX=".5" CenterY=".5" ScaleX="1.5" ScaleY="1.5"/>
</CheckBox.RenderTransform>
</CheckBox>
