© best_vector/Shutterstock.com
WPF und Windows-Apps

Kolumne: XAML Expertise


In der Kolumne „XAML Expertise“präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF: Schließen-Button ausblenden“, „WPF: Vollbildschirm ohne Titel“ und „WPF: Anwendung vom Code aus beenden und neustarten“. Viel Spaß mit XAML Expertise.

WPF: „Schließen“-Button ausblenden

Der Kioskmodus ist ein spezieller Modus, der den Benutzer meist auf eine Hauptanwendung einschränkt. So soll der Benutzer sie auch nicht mehr direkt beenden können. Diese Aufgabe hört sich einfacher an, als sie mit WPF umgesetzt werden kann, denn WPF bietet zum Anpassen von Windows-Fenstern nur die Eigenschaften ResizeMode, WindowState, und WindowStyle. Keine dieser Eigenschaften ermöglicht das Ausblenden des Schließen-Buttons, aber durch einen kleinen Trick lässt sich der Button dennoch ausblenden.

WPF, und damit ebenfalls das .NET Framework, bieten keine Möglichkeit zum Ausblenden des Schlies­sen-Buttons. Das Zeichnen des äußeren Windows-Fensters erfolgt allerdings durch das Betriebssystem selbst. So kann durch Platform Invocation Services (PInvoke) ein Aufruf von Managed-Code auf Unmanaged-Funktionen erfolgen, zum Beispiel auf das Component Object Model (COM). Der Nachteil hierbei ist, dass PInvoke-Aufrufe ohne ausführliche Dokumentation wahnsinnig komplex sind. So bleibt zur Lösung einfach das direkte Abschreiben des Codes aus Listing 1 innerhalb der gewünschten Window-Klasse.

Listing 1: „Schließen“-Button mit PInvoke ausblenden

using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; namespace WpfKioskModeSample { public partial class MainWindow : Window { private const int GWL_STYLE = -16; private const int WS_SYSMENU = 0x80000; [DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); public MainWindow() { InitializeComponent(); Loaded += OnWindowLoaded; } private void OnWindowLoaded(object sender, RoutedEventArgs e) { var hwnd = new WindowInteropHelper(this).Handle; SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU); } } }

Wird jetzt die WPF-Anwendung ausgeführt, wird sie ohne die bekannten Minimier-, Maximier- und Schlies­sen-Buttons angezeigt (Abb. 1). Der Benutzer kann allerdings die Anwendung weiterhin durc...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang