How to Hide Close Button in Wpf Window

How to hide close button in WPF window?

WPF doesn't have a built-in property to hide the title bar's Close button, but 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:

var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);

And there you go: no more Close button. 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.

Important note: all this does is hide the button. The user can still close the window! If the user presses Alt+F4, or closes the app via the taskbar, the window will still close.

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, as Gabe suggested.

Disable Close Button In Title Bar of a WPF Window (C#)

Try this:

public partial class MainWindow : Window
{

[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);


const uint MF_BYCOMMAND = 0x00000000;
const uint MF_GRAYED = 0x00000001;

const uint SC_CLOSE = 0xF060;

public MainWindow()
{
InitializeComponent();
}

protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);

// Disable close button
IntPtr hwnd = new WindowInteropHelper(this).Handle;
IntPtr hMenu = GetSystemMenu(hwnd, false);
if (hMenu != IntPtr.Zero)
{
EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
}
}
}

Taken from here.

Make sure you set the ResizeMode to NoResize.

C# WPF Disable the exit/close button

in wpf this event called Closing :

public Window4()
{
InitializeComponent();
this.Closing += new System.ComponentModel.CancelEventHandler(Window4_Closing);
}

void Window4_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
}

How to hide close button in WPF window?

WPF doesn't have a built-in property to hide the title bar's Close button, but 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:

var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);

And there you go: no more Close button. 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.

Important note: all this does is hide the button. The user can still close the window! If the user presses Alt+F4, or closes the app via the taskbar, the window will still close.

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, as Gabe suggested.

How to hide the close button in a MahApps.Metro window?

You can use the ShowCloseButton dependency property of the MetroWindow.

WPF - Hide minimize button of a window

I think you would have to hide the default window title and draw your own titlebar.

e.g.: C# WPF Custom Title Bar Tutorial
and Moving a WPF Window with Custom Chrome

How to hide close button with WPF & F#

Translation code from tom.maruska to F# will look as follows:

type HideCloseButtonOnWindow() =
inherit Behavior<Window>()

let GWL_STYLE = -16;
let WS_SYSMENU = 0x80000;

[<DllImport("user32.dll", SetLastError = true)>]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[<DllImport("user32.dll")>]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

override x.OnAttached() =
base.OnAttached()
x.AssociatedObject.Loaded.AddHandler(fun s e -> x.OnLoaded(s,e))

override x.OnDetaching() =
x.AssociatedObject.Loaded.RemoveHandler(fun s e -> x.OnLoaded(s,e))
base.OnDetaching()


member x.OnLoaded(sender:obj, e:RoutedEventArgs) =
let hwnd = (new WindowInteropHelper(x.AssociatedObject)).Handle
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) &&& ~~~WS_SYSMENU)
|> ignore

You should open:

open System.Windows.Interactivity
open System.Runtime.InteropServices
open System.Windows.Interop


Related Topics



Leave a reply



Submit