2008-12-04 15 views
66

WPF no proporciona la capacidad de tener una ventana que permite cambiar el tamaño, pero no tiene maximizar o minimizar los botones. Me gustaría poder hacer una ventana así, así puedo tener cuadros de diálogo redimensionables.¿Cómo elimino minimizar y maximizar desde una ventana de tamaño variable en WPF?

Soy consciente de que la solución implicará el uso de pinvoke, pero no estoy seguro de cómo 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 indicarme o proporcionar el código (C# preferido) sobre cómo hacer esto?

Respuesta

93

he robado algo de código que he encontrado en los foros de MSDN e hice un método de extensión en la clase de la ventana, así:

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 que recordar es que por alguna razón este doesn' t trabajo desde el constructor de una ventana. Lo solucioné arrojándolo al constructor:

this.SourceInitialized += (x, y) => 
{ 
    this.HideMinimizeAndMaximizeButtons(); 
}; 

Espero que ayude!

+0

De hecho lo hizo! Muchas gracias! – Nidonocu

+0

Quizás tendría más sentido hacer esto después de que se haya creado el identificador, quizás en un controlador para el evento Inicializado en la ventana? –

+0

Bonita solución Mike. Funciona perfectamente. – BrettRobi

17

No sabe si esto funciona para su req. visualmente .. Esta es

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

Esto casi funciona, pero aún es posible maximizar o minimizar la ventana si hace doble clic en la barra de título, haga clic con el botón derecho y use el menú de control o el botón de la barra de tareas si está disponible. Además, por supuesto, parece una ventana de herramientas, no una ventana normal. – Nidonocu

+0

Derecha ... pero, de nuevo, en mi humilde opinión, la restricción parece extraña de que el usuario no puede maximizar, pero puede arrastrar y agrandar manualmente la ventana mediante el cambio de tamaño. Pero es su ventana ... sus reglas :) – Gishu

+0

esto puede ser útil para situaciones en las que se haya establecido 'MaxWidth' y/o' MaxHeight' de la ventana. –

2

Puede configurar el ResizeMode = "noresize" de la ventana si desea eliminar minimizar y maximizar botón

+0

Ehh pero luego no puede cambiar el tamaño debería poder – Karsten

3

He aquí una solución que estoy usando. Tenga en cuenta que aún se muestra el botón Maximizar.

de marcado:

<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 atrás:

// Disable maximizing this window 
private void Window_StateChanged(object sender, EventArgs e) 
{ 
    if (this.WindowState == WindowState.Maximized) 
     this.WindowState = WindowState.Normal; 
} 
+1

Preguntó cómo ocultar los botones pero mantener la funcionalidad. – alexandrudicu

+0

Tan mínimo como esto es, la ventana parpadea. No tan agradable. – Mugen

73

Una forma es configurar el ResizeMode="NoResize". Se comportará así. enter image description here

Espero que esto ayude!

+0

me ayuda, ¡gracias! –

+22

Esto haría que la ventana no se pudiera redimensionar, lo que es directamente contrario a la pregunta. – Mashmagar

+3

En general, los usuarios de google que buscan una forma de desactivar minimizar y maximizar botones no tienen requisitos específicos para que se pueda cambiar el tamaño de la ventana. Actualmente este es el resultado principal de la consulta "wpf window disable minimize" y esta respuesta responde correctamente a la pregunta. De todos modos, es una pena que MS no haya hecho que la barra de título o la ventana entera de Chrome sean "simplemente otro control o propiedad". Demasiado legado de '90 ... –

3

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; 
    } 
} 
+0

Probablemente leí cinco publicaciones diferentes antes de notar tu respuesta aquí. Esto funciona, pero asco. ¿Alguna vez encontraste una mejor manera? – DonBoitnott

Cuestiones relacionadas