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
C# SQL Server - Passing a List to a Stored Procedure
Determine the Number of Lines Within a Text File
What Is the Use of "Ref" for Reference-Type Variables in C#
C# Convert String from Utf-8 to Iso-8859-1 (Latin1) H
Http Error 500.30 - Ancm In-Process Start Failure
When Is It Better to Use String.Format VS String Concatenation
How to Download HTML Source in C#
Serializing and Deserializing Expression Trees in C#
Is Int[] a Reference Type or a Value Type
How to Convert an Ipv4 Address into a Integer in C#
Typeloadexception Says 'No Implementation', But It Is Implemented
What Is the Use of Observablecollection in .Net
Is There a Generic Constructor with Parameter Constraint in C#
Solution for Overloaded Operator Constraint in .Net Generics
How to Return a String Repeated X Number of Times
C# Class to Parse Webrequestmethods.Ftp.Listdirectorydetails Ftp Response