Tuesday, June 25, 2019

WPF: How To Remove The Min, Max and Close Buttons On a WPF Window

WPF doesn’t have a built-in property to hide the title bar’s Min, Max and Close buttons, however, you can do it with a few lines of P/Invoke.

First, add these declarations to your Window class:
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);

Then put this code in the Window’s Loaded Event:
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    var hwnd = new WindowInteropHelper(this).Handle;
    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
}

No more window buttons. You also won’t have a window icon on the left side of the title bar, which means no System menu, even when you right-click the title bar – they all go together.

Note that Alt+F4 will still close the Window. If you don’t want to allow the window to close before the background thread is done, then you could also override OnClosing and set Cancel to true.

No comments:

Post a Comment

Performance: Linking a List of Child Objects To a List of Parent Objects

Many a time I've had to build a relationship where a parent object has a list of child objects linked to it, where the parent itself als...