TOC

This article has been localized into German by the community.

Grundlegende Kontrollobjekte:

Das Checkbox - Steuerelement

Die Checkbox erlaubt es dem Anwender eine Option an, bzw. auszuschalten. Dies geschieht üblicherweise in einer Boolean Variable im Hintergrund, die entweder auf wahr (true) oder unwahr (false) gesetzt wird. Schauen wir uns dies anhand eines Beispiels an:

<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>

Wie du siehst, ist die CheckBox einfach zu benutzen. Bei der zweiten CheckBox habe ich die Eigenschaft IsChecked auf True (wahr) gesetzt, damit stan­dard­mä­ßig der Haken gesetzt ist, abgesehen davon brauchst Du keine weitere Eigenschaft. Die IsChecked Eigenschaft sollte auch im Code Behind benutzt werden, um zu prüfen, ob eine bestimmte CheckBox angehakt ist oder nicht.

Benutzerdefinierter Inhalt

Das CheckBox-Steuerelement erbt von der ContentControl-Klasse, was bedeutet, dass es benutzerdefinierte Inhalte aufnehmen und daneben anzeigen kann. Wenn Du nur ein Stück Text angibst, wie ich es im obigen Beispiel getan habe, wird WPF es in ein TextBlock-Steuerelement einfügen und anzeigen, aber das ist nur eine Abkürzung, um die Dinge für Dich einfacher zu machen. Du kannst jede Art von Steuerung darin verwenden, wie wir im nächsten Beispiel sehen werden:

<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>

Wie Du aus dem Beispielmarkup ersehen kannst, kannst Du mit dem 'Content' so ziemlich alles machen, was Du willst. Bei allen drei Kontrollkästchen mache ich etwas anderes mit dem Text, und bei dem mittleren benutze ich sogar ein Bild-Control. Durch die Angabe eines Steuerelements als Inhalt, statt nur Text, erhalten wir viel mehr Kontrolle über das Aussehen, und die coole Sache ist: Unabhängig davon, auf welchen Teil des Inhalts Du klickst, wird die CheckBox aktiviert und ein- oder ausgeschaltet.

Die IsThreeState Eigenschaft

Wie erwähnt, entspricht die CheckBox normalerweise einem booleschen Wert, was bedeutet, dass sie nur zwei Zustände hat: true oder false (ein oder aus). Da jedoch ein boolescher Datentyp nullbar sein kann, was eine dritte Option (true, false oder null) erlaubt, kann das CheckBox-Control auch diesen Fall unterstützen. Durch das Setzen der IsThreeState-Eigenschaft auf true erhält die CheckBox einen dritten Zustand, der als "der unbestimmte Zustand" bezeichnet wird.

Eine gängige Anwendung hierfür ist eine "Enable all"-Checkbox, die eine Reihe von untergeordneten Checkboxen steuern und deren Sammelstatus anzeigen kann. Unser Beispiel zeigt, wie Du eine Liste von Funktionen erstellen kannst, die ein- und ausgeschaltet werden können, mit einer gemeinsamen "Enable all"-Checkbox im oberen Bereich:

<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;
		}

	}
}

Dieses Beispiel arbeitet aus zwei verschiedenen Blickwinkeln: Wenn Du das Kontrollkästchen "Enable All" aktivierst oder deaktivierst, werden alle untergeordneten Kontrollkästchen, die in unserem Beispiel jeweils ein Anwendungsmerkmal darstellen, entweder aktiviert oder deaktiviert. Es funktioniert aber auch umgekehrt, wenn das Aktivieren oder Deaktivieren einer untergeordneten CheckBox den CheckBox-Status "Enable all" beeinflusst: Sind sie alle angekreuzt oder nicht angekreuzt, so erhält die CheckBox "Enable all" den gleichen Zustand - andernfalls wird der Wert mit einer Null belassen, was die CheckBox in den unbestimmten Zustand bringt.

All dieses Verhalten ist auf den obigen Screenshots zu sehen und wird durch das Abonnieren der Checkbox-Ereignisse Checked und Unchecked erreicht. In einem realen Beispiel würdest Du die Werte wahrscheinlich stattdessen binden, aber dieses Beispiel zeigt die Grundlagen der Verwendung der IsThreeState-Eigenschaft, um einen "Toggle all"-Effekt zu erzeugen.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!