20.2 Fenster vom Typ »Window«
Mit der Klasse Window wird ein Fenster beschrieben, also das wohl wichtigste Element einer klassischen Windows-Anwendung. Ein Window ist ein Container für alle darin enthaltenen Steuerelemente. Da Window direkt von ContentControl abgeleitet ist, besitzt diese Klasse eine Content-Eigenschaft, die aber nicht explizit angegeben werden muss. Die Content-Eigenschaft kann genau ein Element aufnehmen, das im Fall des Window praktisch immer ein Layout-Container sein dürfte.
Mit der Eigenschaft Title wird der Inhalt der Titelleiste beschrieben, mit den Eigenschaften Height und Width die Breite und die Höhe des Fenster. Diese drei Eigenschaften werden direkt im XAML-Code angeboten, nachdem Sie eine neue WPF-Anwendung gestartet oder ein zusätzliches Window der Anwendung hinzugefügt haben.
Damit sind zumindest die drei wahrscheinlich wichtigsten Eigenschaften schon festgelegt. Neben den genannten können Sie mit vielen weiteren Eigenschaften das Aussehen und das Verhalten eines Window-Objekts beeinflussen. Einen Überblick der wichtigsten Eigenschaften können Sie der folgenden Tabelle entnehmen.
Eigenschaft | Beschreibung |
Per Vorgabe wird als Symbol ein Standard-Icon verwendet. Wollen Sie dieses durch ein anwendungsspezifisches austauschen, geben Sie der Eigenschaft Icon eine ICO-Datei an. |
|
ResizeMode gibt an, ob und wie sich die Größe des betreffenden Window-Elements ändern kann. Die Eigenschaft lässt die Einstellungen NoResize, CanMinimize, CanResize und CanResizeWithGrip zu. Je nach Wahl der Einstellung werden die Schaltflächen zum Minimieren und Maximieren in der Titelleiste angezeigt. Der Standard ist CanResize. |
|
Die Eigenschaft legt fest, ob das minimierte Fenster in der Taskleiste angezeigt wird. Der Vorgabewert ist true. |
|
Legt fest, ob die Größe eines Fensters automatisch an die Größe des Inhalts angepasst wird. Die Standardeinstellung Manual bedeutet, dass sich die Größe aus den Einstellungen Height und Width des Fensters ergibt. Die Eigenschaft selbst lässt darüber hinaus auch die Einstellungen Width, Height und WidthAndHeight zu. Bei letztgenannter Einstellung wird die angezeigte Breite und Höhe des Fensters automatisch an die Breite und Höhe des Inhalts angepasst. |
|
Wird diese Eigenschaft auf true eingestellt, erscheint dieses Fenster immer über allen anderen Fenstern der Anwendung. |
|
Legt die Position des Fensters fest, wenn es zum ersten Mal angezeigt wird. Die möglichen Einstellungen sind Manual, CenterScreen und CenterOwner. Manual ist der Standard und wird durch die Eigenschaften Left und Top des Fensters beschrieben. Mit CenterScreen wird das Fenster in Bildschirmmitte angezeigt, mit CenterOwner mittig bezüglich eines anderen Fensters, aus dem heraus das aktuelle Fenster aufgerufen wird. |
|
Diese Eigenschaft beschreibt die drei Fensterzustände Normal, Minimized und Maximized. |
|
Gibt den Rahmentyp für das Fenster an. Die möglichen Einstellungen hier lauten None (weder Rahmen noch Titelleiste werden angezeigt), SingleBorderWindow (das ist der Standard), ThreeDBorderWindow (Fenster mit 3D-Rahmen) und ToolWindow (verankertes Toolfenster mit minimierten Fensterrändern). |
20.2.1 Mehrere Fenster in einer Anwendung
Enthält eine WPF-Anwendung nur ein Fenster, wird die Anwendung mit dem Schließen des Fensters beendet. Anwendungen mit nur einem Fenster stellen aber eher die Ausnahme dar, die meisten Anwendungen weisen mehr oder weniger viele Fenster auf. Entwickeln Sie eine Anwendung mit mehreren Fenstern, können Sie das gewünschte Startfenster im Wurzelelement Application der Datei App.xaml angeben. Dazu ändern Sie einfach nur die Angabe des Attributs StartupUri passend ab.
<Application ...
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>
Listing 20.1 Angabe des Startfensters in der Datei »App.xaml«
Beendet wird eine WPF-Anwendung mit dem Schließen des letzten Fensters.
Jedes neu zu öffnende Fenster muss zuerst als Objekt vorliegen. Dazu instanziieren Sie die Klasse und rufen die Methode Show auf.
Window1 frm = new Window1();
frm.Show();
Das Fenster wird nichtmodal geöffnet. Das heißt, der Benutzer kann ein anderes Fenster der laufenden Anwendung aktivieren. Fenster lassen sich auch modal öffnen. Modal geöffnete Fenster erlauben nicht, ein anderes Fenster der aktuellen Anwendung zu aktivieren. Das modale Fenster muss erst wieder geschlossen werden. Üblicherweise werden modale Fenster auch als Dialogfenster bezeichnet. Eingesetzt werden sie da, wo der Anwender Angaben machen muss, die von der Anwendung sofort in irgendeiner Form umgesetzt werden.
Um ein Fenster als Dialogfenster modal zu öffnen, rufen Sie anstatt der Methode Show die Methode ShowDialog auf. Im Gegensatz zu Show hat die Methode ShowDialog einen Rückgabewert vom Typ Boolean? (mit anderen Worten handelt es sich um einen null-fähigen Boolean). Die Rückgabe kann also true, false oder null sein, der Standardwert ist false. Wie Sie gleich noch sehen werden, benötigen wir diesen Rückgabewert zur Auswertung, welche Aktion zum Schließen des Dialogs geführt hat.
Fenster schließen
Um ein Fenster zu schließen, stehen Ihnen zwei Möglichkeiten zur Verfügung: die Methoden Hide und Close.
Mit Hide wird das Fenster nur unsichtbar gemacht, bleibt aber weiterhin im Speicher. Sie können das Fenster durch den erneuten Aufruf der Methode Show zur Anzeige bringen, ohne dass eine Neuinstanziierung notwendig ist. Das Fenster wird in dem Zustand geöffnet, den es vor dem Aufruf von Hide hatte.
Mit Close wird das Fenster geschlossen, und die beanspruchten Ressourcen werden freigegeben. Das bringt natürlich Ressourcenvorteile im Vergleich zum Verstecken des Fensters. Benötigen Sie das Fenster erneut, müssen Sie die zugrunde liegende Klasse instanziieren.
Beim Schließen eines Fensters treten nacheinander die beiden Ereignisse Closing und Closed auf. Beide unterscheiden sich in der Programmierung dahingehend, dass im Ereignishandler von Closing der eingeleitete Schließvorgang im letzten Augenblick noch abgebrochen werden kann. Dazu setzen Sie die Eigenschaft Cancel des EventArgs-Parameters auf true, z. B.:
private void Window_Closing(object sender, CancelEventArgs e)
{
MessageBoxResult result = MessageBox.Show("Schließen?", "Beenden",
MessageBoxButton.YesNo,
MessageBoxImage.Question,
MessageBoxResult.No);
if (result == MessageBoxResult.No)
e.Cancel = true;
}
Listing 20.2 Den eingeleiteten Schließvorgang optional abbrechen
Diese Chance gibt es nicht mehr, wenn das Ereignis Closed ausgelöst wird. Im Zweifelsfall sind jetzt noch die Benutzereingaben zu speichern, ansonsten sind sie unwiederbringlich verloren.
Modale Fenster schließen
Modale Fenster haben in der Regel zwei Schaltflächen. Diese sind meistens mit OK und Abbrechen beschriftet. Von einem modalen Fenster wird erwartet, dass es nach dem Klicken einer der beiden Schaltflächen geschlossen wird. Die OK-Schaltfläche signalisiert dabei dem aufrufenden Fenster, dass der Anwender seine Eingaben im Dialog bestätigt, die Abbrechen-Schaltfläche, dass die Aktion abgebrochen worden ist.
Bei der Abbrechen-Schaltfläche sollten Sie deren Eigenschaft IsCancel auf true einstellen. Damit wird das Fenster geschlossen, wenn der Anwender auf die Schaltfläche klickt (was übrigens auch mit Drücken der -Taste erfolgen kann). Sie benötigen dann auch keinen separaten Ereignishandler für diese Aktion. Im XAML-Code könnten damit die beiden Schaltflächen OK und Abbrechen wie im folgenden Listing gezeigt definiert sein:
<Button Content="OK" Click="btnOK_Click" ... />
<Button Content="Abbrechen" IsCancel="True" ... />
Listing 20.3 »OK«- und »Abbrechen«-Schaltfläche im Dialogfenster
Bei der OK-Schaltfläche eines Dialogfensters hingegen wird ein Ereignishandler für den Schließvorgang benötigt. Meistens handelt es sich um den Handler, der auf das Click-Ereignis der OK-Schaltfläche reagiert. Im Ereignishandler legen Sie die Eigenschaft DialogResult des WPF-Fensters auf true fest, z. B.:
private void btnOK_Click(object sender, RoutedEventArgs e){
DialogResult = true;
}
Listing 20.4 »OK«-Schaltfläche eines modalen Dialogs
Mit dem Setzen der Eigenschaft ist auch gleichzeitig das Schließen des Dialogs verbunden.
Sie können durch das Festlegen der Eigenschaft IsDefault=true der OK-Schaltfläche dem Dialog mitteilen, dass es sich bei dieser Schaltfläche um die Standardschaltfläche handelt, die der Anwender durch Drücken der -Taste erreichen kann. Das bedeutet mit anderen Worten: Unabhängig davon, welches Steuerelement im Fenster aktuell den Fokus hat, wird beim Drücken der -Taste das Click-Ereignis der OK-Schaltfläche ausgelöst und der entsprechende Ereignishandler abgearbeitet.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.