web-dev-qa-db-fra.com

Comment puis-je supprimer minimiser et maximiser d'une fenêtre redimensionnable dans WPF?

WPF ne fournit pas la possibilité d'avoir une fenêtre qui autorise le redimensionnement mais n'a pas de boutons maximiser ou réduire. Je voudrais pouvoir faire une telle fenêtre afin que je puisse avoir des boîtes de dialogue redimensionnables.

Je suis conscient que la solution impliquera l'utilisation de pinvoke mais je ne sais pas comment appeler ni comment. Une recherche sur pinvoke.net n’a révélé aucun élément qui m’avait semblé être nécessaire, surtout parce que Windows Forms fournit les propriétés CanMinimize et CanMaximize sur ses fenêtres.

Quelqu'un pourrait-il me diriger vers ou fournir un code (C # préféré) sur la façon de procéder?

72
Nidonocu

J'ai volé du code trouvé sur les forums MSDN et créé une méthode d'extension sur la classe Window, comme ceci:

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 seule autre chose à retenir est que, pour une raison quelconque, cela ne fonctionne pas à partir du constructeur de la fenêtre. J'ai contourné cela en glissant ceci dans le constructeur:

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

J'espère que cela t'aides!

100
Matt Hamilton

Une solution consiste à définir votre ResizeMode="NoResize". Il se comportera comme ceci .enter image description here

J'espère que ça aide!

77
Musikero31

 

Je ne sais pas si cela fonctionne pour votre req. visuellement .. Ceci est 

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

Si quelqu'un utilise la fenêtre Devexpress (DXWindow), la réponse acceptée ne fonctionne pas. Une approche laide est 

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;
    } 
}
5
Eldar

Voici une solution que j'utilise. Notez que le bouton Agrandir est toujours affiché.

Balisage:

<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">

Code derrière:

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

Vous pouvez définir le ResizeMode = "NoResize" de la fenêtre si vous souhaitez supprimer les boutons Réduire et Agrandir.

1
Chinmay Behera

Cette variante de la solution proposée par @MattHamilton peut (et doit) être appelée dans le constructeur de Window. L'astuce consiste à abonner un délégué à l'événement SourceInitialized au sein de la méthode d'extension.

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);

/// <summary>
/// Hides the Minimize and Maximize buttons in a Window. Must be called in the constructor.
/// </summary>
/// <param name="window">The Window whose Minimize/Maximize buttons will be hidden.</param>
public static void HideMinimizeAndMaximizeButtons(this Window window)
{
    window.SourceInitialized += (s, e) => {
        IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
        int currentStyle = GetWindowLong(hwnd, GWL_STYLE);

        SetWindowLong(hwnd, GWL_STYLE, currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
    };
}