wpf user-interface resize pinvoke

¿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!


No sé si esto funciona para su pedido. visualmente .. Esto es

<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip">