Désactiver le bouton d'agrandissement de la fenêtre WPF, en gardant fonctionnalité de redimensionnement intacte
Donc, WPF, windows seulement quatre mode de redimensionnement options: NoResize
, CanMinimize
, CanResize
et CanResizeWithGrip
. Malheureusement, les options de redimensionnement également permettre l'agrandissement de la fenêtre, et ceux qui n'en ont pas sont inutiles pour moi.
Est-il une option pour désactiver le bouton agrandir tout en gardant la fonction de redimensionnement?
Je préfère des solutions qui n'impliquent pas de WinAPI
choses.
- Pourquoi voudriez-vous désactiver le bouton agrandir, tout en permettant à la fenêtre pour être redimensionnée?
- Parce que les fenêtres qui ont un MaxWidth ensemble regardent habituellement comme de la merde quand agrandie. Essayez de maximiser l'invite de commande et vous verrez.
- WPF boîtes de dialogue en sont de bons exemples. Jetez un oeil à VS2013 de Options de la fenêtre - c'est redimensionnable mais il y a n réduire ou agrandir les boutons
- Un utilisateur sera rarement intentionnellement redimensionner une fenêtre pour couvrir les avoir à y penser d'autre, ou de le réduire et de "perdre", ce qui provoque la confusion. Avec les boutons, cela se passe très facilement.
Vous devez vous connecter pour publier un commentaire.
WPF n'ont pas la capacité native de désactiver le bouton agrandir seul, comme vous pouvez le voir avec WinForms. Vous devez recourir à un WinAPI appel. Ce n'est pas effrayant:
Désactivé seulement d'Optimiser:
Si vous définissez
Dans votre fenêtre de propriétés, il vous donnera une fenêtre redimensionnable sans minimiser ou maximiser les boutons en haut. Il sera carré à la recherche et le bouton de fermeture est également en place, mais au moins, minimiser et maximiser ne sont pas là!
P/Invoke Méthode
La manière la plus simple d'appeler du code non managé (C++ dans ce cas) provenant de la gestion de (.NET) du code est d'utiliser la Plate-forme d'Invocation de Services, souvent aussi appelé P/Invoke. Il vous suffit de fournir le compilateur avec une déclaration de la fonction non managée et appelez le comme vous le feriez d'appeler une autre méthode gérée. Il y a un non géré SetWindowLong méthode qui peut être utilisé pour modifier un attribut d'une fenêtre spécifiée. Pour être en mesure d'appeler cette méthode à partir de votre fenêtre WPF classe à l'aide de P/Invoke, il vous suffit d'ajouter la déclaration suivante à la classe de fenêtre:
L'attribut DllImport spécifie le nom de la DLL qui contient la méthode et le mot-clé extern dit le compilateur C# que la méthode est mise en oeuvre à l'externe et qu'il ne sera pas trouver une quelconque application ou corps de la méthode lors de la compilation de l'application. Le premier argument passé à la SetWindowLong méthode est un handle de la fenêtre pour laquelle vous souhaitez désactiver l'un de ces boutons. Vous pouvez obtenir la poignée pour une fenêtre WPF par la création d'une instance de gestion des WindowInteropHelper de classe et d'accéder à ses biens dans un gestionnaire d'événement pour la fenêtre SourceInitialized événement. Cet événement est déclenché lorsque la poignée a été entièrement créée. Le deuxième argument de la SetWindowLong méthode spécifie l'attribut ou la valeur de la fenêtre pour être ensemble, exprimé comme un nombre entier constant de la valeur. Lorsque vous voulez changer le style de la fenêtre, vous devriez passer l'GWL_STYLE (= -16) constant que le deuxième argument de la méthode.
Enfin, le troisième argument indique la valeur de remplacement. Il y a un ensemble de constantes que vous pouvez utiliser ici:
Noter cependant que depuis que vous êtes censé passer dans un DWORD qui spécifie la valeur complète de la “propriété” indiquée par le deuxième argument, c'est à dire le style de fenêtre dans ce cas, vous ne pouvez pas tout simplement passer une de ces constantes par eux-mêmes comme troisième argument de la méthode. Il y a un autre GetWindowLong méthode qui récupère la valeur actuelle d'une propriété spécifique de nouveau le GWL_STYLE dans ce cas – et vous pouvez alors utiliser les opérateurs sur les bits pour obtenir la valeur correcte de la troisième paramètre à passer à la SetWindowLong méthode. Ci-dessous est un exemple de code complet de la façon dont vous pouvez désactiver le bouton réduire pour une fenêtre WPF:
De désactiver le bouton réduire suffit alors de remplacer le WS_MAXIMIZEBOX constante avec le WS_MINIMIZEBOX
Une autre option est la capture de la
StateChanged
événement qui est déclenché lorsque la fenêtre est maximisée. Ensuite il suffit de régler laWindowState
à la "Normale".Cela ne pas cacher optimiser la boîte!
Vous pouvez créer une fenêtre personnalisée par la mise en WindowStyle à Aucun, ce qui supprime les Minimiser, Maximiser et Fermer les boutons, et de créer vous-même les boutons dont vous avez besoin.
C'est un excellent exemple de cela:
http://www.codeproject.com/Articles/131515/WPF-Custom-Chrome-Library
Il vous donne un peu de travail supplémentaire, mais si vous avez vraiment ne voulez pas utiliser la WinAPI, c'est une option.