Für eine kleine Anwendung in WPF / C# wollte ich heute einen Vollbild-Modus realisieren. Voraussetzung:
- Aktivieren des Vollbild-Modus mit [F10]
- Deaktivieren des Vollbild-Modus mit [F10] oder [Esc]
Der erste Schritt dazu – klar: Abonnieren des KeyUp-Events:
this.KeyUp += new KeyEventHandler(_this_KeyUp);
Oder eben in WPF:
<Window [...] KeyUp="_this_KeyUp">
...
</Window>
Der einfache EventHandler lautete wie folgt:
private void _this_KeyUp(object sender, KeyEventArgs e)
{
bool IsFullscreen = WindowState == WindowState.Maximized;
bool MaxKeyPressed = e.Key == Key.F10;
bool NrmKeyPressed = e.Key == Key.Escape;
if (!IsFullscreen && MaxKeyPressed)
{
WindowState = WindowState.Maximized;
WindowStyle = WindowStyle.None;
ResizeMode = ResizeMode.NoResize;
e.Handled = true;
}
else if(MaxKeyPressed || NrmKeyPressed)
{
WindowState = WindowState.Normal;
WindowStyle = WindowStyle.SingleBorderWindow;
ResizeMode = m_DefaultResizeMode;
e.Handled = true;
}
}
Problem Nr. 1: Es passiert nichts… Das Event wird ausgelöst – der Vergleich `e.Key == Key.F10` trifft aber niemals zu.
Also den Debugger angeworfen – des Rätels Lösung ist zwar auf den ersten Blick seltsam, aber am Ende simpel: bei Betätigen der [F10]-Taste ist der Wert `e.Key == Key.System`. Die Abfrage, ob [F10] gedrückt wurde, muss also wie folgt lauten:
bool MaxKeyPressed = e.Key == Key.System && e.SystemKey == Key.F10
OK- die Anwendung reagiert nun auf Druck der F10-Taste, das Switchen der Fenster-Stati funktioniert ebenfalls.
Fast… – das Fenster sollte noch die Taskleiste überdecken. Auch das ist am Ende einfach zu lösen:
Beim Setzen der Fenster-Eigenschaften muss eine definierte Reihenfolge eingehalten werden. Mit folgendem Code funktioniert dann alles wie gewünscht:
private void _this_KeyUp(object sender, KeyEventArgs e)
{
bool IsFullscreen = WindowState == WindowState.Maximized;
bool MaxKeyPressed = (e.Key == Key.System && e.SystemKey == Key.F10);
bool NrmKeyPressed = e.Key == Key.Escape;
if (!IsFullscreen && MaxKeyPressed)
{
WindowStyle = WindowStyle.None;
ResizeMode = ResizeMode.NoResize;
WindowState = WindowState.Maximized;
e.Handled = true;
}
else if(MaxKeyPressed || NrmKeyPressed)
{
e.Handled = true;
WindowState = WindowState.Normal;
ResizeMode = m_DefaultResizeMode;
WindowStyle = WindowStyle.SingleBorderWindow;
}
}
Um mit der Angabe `WindowState = WindowState.Maximized` auch die Taskbar zu überdecken, müssen lediglich vorher alle Rahmen ausgeblendet werden. Das geschieht hier durch Setzen des `WindowStyle` und `ResizeMode`.





