¿Cómo elimino minimizar y maximizar desde una ventana de tamaño variable en WPF?
user-interface resize (6)
Aquí hay una solución que estoy usando. Tenga en cuenta que aún se muestra el botón Maximizar.
Margen:
<Window x:Class="Example"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Example"
StateChanged="Window_StateChanged">
Código detrás:
// Disable maximizing this window
private void Window_StateChanged(object sender, EventArgs e)
{
if (this.WindowState == WindowState.Maximized)
this.WindowState = WindowState.Normal;
}
WPF no ofrece la capacidad de tener una ventana que permita cambiar el tamaño, pero no tiene botones de maximizar o minimizar. Me gustaría poder hacer una ventana así, así puedo tener cuadros de diálogo redimensionables.
Soy consciente de que la solución significará usar Pinvoke, pero no estoy seguro de a qué llamar y cómo. Una búsqueda en pinvoke.net no arrojó nada que me saltara como lo que necesitaba, principalmente estoy seguro porque Windows Forms proporciona las propiedades CanMinimize
y CanMaximize
en sus ventanas.
¿Podría alguien señalarme o proporcionar código (C # preferido) sobre cómo hacer esto?
He robado un código que encontré en los foros de MSDN e hice un método de extensión en la clase Window, como este:
internal static class WindowExtensions
{
// from winuser.h
private const int GWL_STYLE = -16,
WS_MAXIMIZEBOX = 0x10000,
WS_MINIMIZEBOX = 0x20000;
[DllImport("user32.dll")]
extern private static int GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
extern private static int SetWindowLong(IntPtr hwnd, int index, int value);
internal static void HideMinimizeAndMaximizeButtons(this Window window)
{
IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
var currentStyle = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX));
}
}
La única otra cosa para recordar es que, por alguna razón, esto no funciona desde el constructor de una ventana. Lo solucioné arrojándolo al constructor:
this.SourceInitialized += (x, y) =>
{
this.HideMinimizeAndMaximizeButtons();
};
¡Espero que esto ayude!
Puede configurar ResizeMode = "NoResize" de la ventana si desea eliminar el botón Minimizar y Maximizar
Si alguien usa la ventana Devexpress (DXWindow) la respuesta aceptada no funciona. Un enfoque feo es
public partial class MyAwesomeWindow : DXWindow
{
public MyAwesomeWIndow()
{
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
// hides maximize button
Button button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Maximize.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
// hides minimize button
button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Minimize.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
// hides close button
button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_CloseButton.ToString());
button.IsHitTestVisible = false;
button.Opacity = 0;
}
}
Una forma es establecer su ResizeMode="NoResize"
. Se comportará así.
¡Espero que esto ayude!