93 votes

Comment supprimer les fonctions minimiser et maximiser d'une fenêtre redimensionnable dans WPF ?

WPF ne fournit pas la possibilité d'avoir une fenêtre qui permet de redimensionner mais qui n'a pas de boutons de maximisation ou de minimisation. J'aimerais pouvoir créer une telle fenêtre afin d'avoir des boîtes de dialogue redimensionnables.

Je suis conscient que la solution implique l'utilisation de pinvoke mais je ne suis pas sûr de ce qu'il faut appeler et comment. Une recherche sur pinvoke.net n'a rien donné qui m'ait fait penser à ce dont j'avais besoin, principalement, j'en suis sûr, parce que Windows Forms fournit les propriétés CanMinimize et CanMaximize sur ses fenêtres.

Quelqu'un pourrait-il m'indiquer ou me fournir un code (C# de préférence) sur la façon de faire cela ?

125voto

Matt Hamilton Points 98268

J'ai volé du code que j'ai trouvé sur les forums MSDN et j'ai 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 d'une fenêtre. Je l'ai contourné en l'insérant dans le constructeur :

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

J'espère que cela vous aidera !

0 votes

Peut-être serait-il plus judicieux d'effectuer cette opération après la création de l'identifiant, peut-être dans un gestionnaire de l'événement Initialized de la fenêtre ?

3 votes

Un code un peu plus joli dans la fenêtre : protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e) ; this.HideMinimizeAndMaximizeButtons() ; }.

1 votes

Pourquoi ne pas faire encore plus simple et souscrire à l'événement SourceInitialized directement dans la méthode HideMinimizeAndMaximizeButtons() ? Vous pouvez alors appeler la méthode depuis le constructeur et ne pas avoir à faire quoi que ce soit d'autre.

112voto

Musikero31 Points 991

Une façon de procéder est de définir votre ResizeMode="NoResize" . Il se comportera comme suit. enter image description here

J'espère que cela vous aidera !

39 votes

Cela rendrait la fenêtre non redimensionnable, ce qui est directement contraire à la question.

9 votes

En général, les googleurs qui cherchent un moyen de désactiver les boutons de minimisation et d'agrandissement n'ont pas d'exigence spécifique pour que la fenêtre soit redimensionnée. Actuellement, c'est le premier résultat pour la requête "wpf window disable minimize" et cette réponse répond correctement à la question. Quoi qu'il en soit, c'est une honte que MS n'ait pas fait de la barre de titre ou du chrome de la fenêtre entière "un autre contrôle ou une autre propriété". Trop d'héritage des années 90...

2 votes

Dans ce cas, les éléments avec une largeur dynamique (par exemple, DockPanel) sont toujours capables de changer la taille de la fenêtre. Mais plus l'utilisateur. Cette option répond donc à mes besoins.

26voto

Gishu Points 59012

Je ne sais pas si cela correspond à votre demande, mais C'est

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

3 votes

Cela fonctionne presque, mais il est toujours possible de maximiser ou de minimiser la fenêtre si vous double-cliquez sur la barre de titre, faites un clic droit et utilisez le menu de contrôle ou le bouton de la barre des tâches s'il est disponible. De plus, la fenêtre ressemble à une fenêtre d'outils et non à une fenêtre normale.

0 votes

D'accord... mais encore une fois IMHO la contrainte semble étrange que l'utilisateur n'est pas autorisé à maximiser mais peut manuellement glisser-élargir la fenêtre en la redimensionnant. Mais c'est votre fenêtre... vos règles :)

0 votes

Cela peut être pratique dans les situations où le MaxWidth et/ou MaxHeight de la fenêtre a été définie.

3voto

Andrej Points 19

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

Markup :

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

1 votes

Il a demandé comment masquer les boutons tout en conservant la fonctionnalité.

0 votes

Aussi minime que cela puisse être, la fenêtre vacille. Pas si bien.

2voto

Chinmay Behera Points 53

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

1 votes

Ehh mais alors vous ne pouvez pas le redimensionner, vous devriez pouvoir le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X