This article is currently in the process of being translated into Japanese (~90% done).
The CheckBox control
CheckBoxコントロールはユーザーにオプションをON/OFF出来るようにします。そして通常、ON/OFFはコードビハインドでブール値で受け取ります。CheckBoxの外観はよく知っているとは思いますが、次の例に行きましょう。
<Window x:Class="WpfTutorialSamples.Basic_controls.CheckBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CheckBoxSample" Height="140" Width="250">
<StackPanel Margin="10">
<Label FontWeight="Bold">Application Options</Label>
<CheckBox>Enable feature ABC</CheckBox>
<CheckBox IsChecked="True">Enable feature XYZ</CheckBox>
<CheckBox>Enable feature WWW</CheckBox>
</StackPanel>
</Window>
CheckBoxは非常に簡単に使えるのがわかると思います。2番めのCheckBoxはIsCheckedプロパティでデフォルトをチェック済みに設定しました。デフォルトチェックなしにする場合はプロパティの設定は必要ありません。IsCheckedプロパティは、特定のCheckBoxがチェックされているかどうか確認する場合はコードビハインドからも使う必要があります。
カスタムコンテンツ
CheckBoxコントロールはContentControlクラスを継承していて、これはカスタムコンテンツを取得してそれを表示できることを意味します。上の例のように短いテキストを設定した場合、WPFは内部でTextBlockコントロールを置いて表示します。これは事物を簡単にするための近道です。次の例が示すように、あらゆるタイプのコントロールを内部で使うことが出来ます。
<Window x:Class="WpfTutorialSamples.Basic_controls.CheckBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CheckBoxSample" Height="140" Width="250">
<StackPanel Margin="10">
<Label FontWeight="Bold">Application Options</Label>
<CheckBox>
<TextBlock>
Enable feature <Run Foreground="Green" FontWeight="Bold">ABC</Run>
</TextBlock>
</CheckBox>
<CheckBox IsChecked="True">
<WrapPanel>
<TextBlock>
Enable feature <Run FontWeight="Bold">XYZ</Run>
</TextBlock>
<Image Source="/WpfTutorialSamples;component/Images/question.png" Width="16" Height="16" Margin="5,0" />
</WrapPanel>
</CheckBox>
<CheckBox>
<TextBlock>
Enable feature <Run Foreground="Blue" TextDecorations="Underline" FontWeight="Bold">WWW</Run>
</TextBlock>
</CheckBox>
</StackPanel>
</Window>
サンプルのマークアップでわかるように、やりたいことはコンテンツを使って何でも出来ます。これらの3つのチェックボックスで、テキストを使ってそれぞれ異なることを行いました。真ん中のものはイメージコントロールを挿入しました。コンテンツとして単なるテキストの代わりにコントロールを指定すると外観をより細かく制御でき、コンテンツのどの部分をクリックしても問題なくCheckBoxがONまたはOFFにトグルします。
IsThreeStateプロパティ
既に述べたように、CheckBoxは通常、ブール値に対応しており、trueかfalse(ONかOFF)の二つの状態だけを取ります。しかし、ブール値のデータはnull可能で、3番めのオプション(true,falseとnull)を効果的に有効にするため、CheckBoxはこのケースをサポートしました。IsThreeStateプロパティをtrueに設定することでCheckBoxは"不確定状態"と呼ばれる状態になります。
これの一般的な使い方は、"Enable all" CheckBoxを作ることです。これは一組の子チェックボックスを制御したり、子チェックボックス全体の状態を表示したり出来ます。例では、一番上の一般的な"Enable all" チェックボックスで、どのようにON/OFFをトグルする機能のリストを作るか示します。
<Window x:Class="WpfTutorialSamples.Basic_controls.CheckBoxThreeStateSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CheckBoxThreeStateSample" Height="170" Width="300">
<StackPanel Margin="10">
<Label FontWeight="Bold">Application Options</Label>
<StackPanel Margin="10,5">
<CheckBox IsThreeState="True" Name="cbAllFeatures" Checked="cbAllFeatures_CheckedChanged" Unchecked="cbAllFeatures_CheckedChanged">Enable all</CheckBox>
<StackPanel Margin="20,5">
<CheckBox Name="cbFeatureAbc" Checked="cbFeature_CheckedChanged" Unchecked="cbFeature_CheckedChanged">Enable feature ABC</CheckBox>
<CheckBox Name="cbFeatureXyz" IsChecked="True" Checked="cbFeature_CheckedChanged" Unchecked="cbFeature_CheckedChanged">Enable feature XYZ</CheckBox>
<CheckBox Name="cbFeatureWww" Checked="cbFeature_CheckedChanged" Unchecked="cbFeature_CheckedChanged">Enable feature WWW</CheckBox>
</StackPanel>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.Basic_controls
{
public partial class CheckBoxThreeStateSample : Window
{
public CheckBoxThreeStateSample()
{
InitializeComponent();
}
private void cbAllFeatures_CheckedChanged(object sender, RoutedEventArgs e)
{
bool newVal = (cbAllFeatures.IsChecked == true);
cbFeatureAbc.IsChecked = newVal;
cbFeatureXyz.IsChecked = newVal;
cbFeatureWww.IsChecked = newVal;
}
private void cbFeature_CheckedChanged(object sender, RoutedEventArgs e)
{
cbAllFeatures.IsChecked = null;
if((cbFeatureAbc.IsChecked == true) && (cbFeatureXyz.IsChecked == true) && (cbFeatureWww.IsChecked == true))
cbAllFeatures.IsChecked = true;
if((cbFeatureAbc.IsChecked == false) && (cbFeatureXyz.IsChecked == false) && (cbFeatureWww.IsChecked == false))
cbAllFeatures.IsChecked = false;
}
}
}
この例は二つの異なる観点で動作します。"Enable all" CheckBoxをチェックする・外す場合はアプリケーションの機能を表した子チェックボックスがすべてチェックされるかチェックが外されます。逆でもまた動作します。子チェックボックスをチェックしたり外したりすると、"Enable all" CheckBoxに影響します。もし、子チェックボックスがすべてチェックされているか、チェックが外されていると"Enable all" CheckBoxはそれと同じ状態になります。その他の場合、値はnullのままになり、CheckBoxは不確定状態になります。
上のスクリーンショットのすべての振る舞いはCheckBoxコントロールのCheckedとUncheckedイベントをサブスクライブすることで出来ています。実際の例では代わりに値をバインドするほうが適しているかもしれませんが、この例は ”全て切り替える” 動作をさせるIsThreeStateプロパティの基本的な使い方を示しています。