J'écris une boîte de dialogue modale dans WPF. Comment définir une fenêtre WPF pour ne pas avoir de bouton de fermeture? Je voudrais toujours que sa WindowState
barre de titre soit normale.
J'ai trouvé ResizeMode
,, WindowState
et WindowStyle
, mais aucune de ces propriétés ne me permet de masquer le bouton de fermeture mais d'afficher la barre de titre, comme dans les boîtes de dialogue modales.
Réponses:
WPF n'a pas de propriété intégrée pour masquer le bouton Fermer de la barre de titre, mais vous pouvez le faire avec quelques lignes de P / Invoke.
Tout d'abord, ajoutez ces déclarations à votre classe Window:
Ensuite, mettez ce code dans la fenêtre de
Loaded
événement de :Et voilà: plus de bouton Fermer. Vous n'aurez pas non plus d'icône de fenêtre sur le côté gauche de la barre de titre, ce qui signifie qu'il n'y a pas de menu système, même lorsque vous cliquez avec le bouton droit sur la barre de titre - ils vont tous ensemble.
Notez que Alt+ F4fermera toujours la fenêtre. Si vous ne souhaitez pas autoriser la fermeture de la fenêtre avant la fin du thread d'arrière-plan, vous pouvez également remplacer
OnClosing
et définir la valeurCancel
true, comme l'a suggéré Gabe.la source
SetWindowLongPtr
place.Je viens d'arriver à un problème similaire et la solution de Joe White me semble simple et propre. Je l'ai réutilisé et l'ai défini comme une propriété attachée de Window
Ensuite, en XAML, vous le définissez comme ceci:
la source
Définissez la
WindowStyle
propriété sur Aucun, ce qui masquera la boîte de contrôle ainsi que la barre de titre. Pas besoin d'appels kernal.la source
this.DragMove();
à l'MouseDown
événement de la fenêtreCela ne supprimera pas le bouton de fermeture, mais cela empêchera quelqu'un de fermer la fenêtre.
Mettez ceci dans votre code derrière le fichier:
la source
Window
boîte de dialogue modale interfère avec laWindow
définition de saDialogResult
propriété et peut la rendre inutilisable. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfPour désactiver le bouton de fermeture, vous devez ajouter le code suivant à votre classe Window (le code a été extrait d' ici , modifié et reformaté un peu):
Ce code désactive également la fermeture de l'élément dans le menu Système et interdit la fermeture de la boîte de dialogue à l'aide de Alt + F4.
Vous voudrez probablement fermer la fenêtre par programme. L'appel
Close()
ne fonctionnera pas. Faites quelque chose comme ça:la source
J'essayais la réponse de Viachaslau car j'aime l'idée de ne pas retirer le bouton mais de le désactiver, mais pour une raison quelconque, cela n'a pas toujours fonctionné: le bouton de fermeture était toujours activé mais aucune erreur que ce soit.
Cela a en revanche toujours fonctionné (vérification des erreurs omise):
la source
Window
méthode d'extension dans mon projet.La propriété à définir est =>
WindowStyle="None"
la source
J'ajoute simplement mon implémentation de la réponse de Joe White en utilisant le comportement d'interactivité (vous devez référencer System.Windows.Interactivity).
code:
usage:
la source
Laissez l'utilisateur "fermer" la fenêtre mais masquez-la simplement.
Dans l'événement OnClosing de la fenêtre, masquez la fenêtre si elle est déjà visible:
Chaque fois que le thread d'arrière-plan doit être exécuté, affichez à nouveau la fenêtre d'interface utilisateur d'arrière-plan:
Lorsque vous terminez l'exécution du programme, assurez-vous que toutes les fenêtres sont / peuvent être fermées:
la source
Voici donc à peu près votre problème. Le bouton de fermeture en haut à droite d'un cadre de fenêtre ne fait pas partie de la fenêtre WPF, mais il appartient à la partie du cadre de fenêtre qui est contrôlée par votre système d'exploitation. Cela signifie que vous devrez utiliser l'interopérabilité Win32 pour le faire.
alternativement, vous pouvez utiliser le noframe et soit fournir votre propre «cadre», soit n'avoir aucun cadre.
la source
Ce qui suit concerne la désactivation des boutons Fermer et Agrandir / Réduire, cela ne supprime pas réellement les boutons (mais il supprime les éléments de menu!). Les boutons de la barre de titre sont dessinés dans un état désactivé / grisé. (Je ne suis pas tout à fait prêt à reprendre moi-même toutes les fonctionnalités ^^)
Ceci est légèrement différent de la solution Virgoss en ce qu'elle supprime les éléments de menu (et le séparateur de fin, si nécessaire) au lieu de simplement les désactiver. Elle diffère de la solution Joe Whites car elle ne désactive pas l'intégralité du menu système et donc, dans mon cas, je peux garder le bouton et l'icône Réduire.
Le code suivant prend également en charge la désactivation des boutons Agrandir / Réduire car, contrairement au bouton Fermer, la suppression des entrées du menu n'entraîne pas le système à rendre les boutons «désactivés» même si la suppression des entrées de menu ne désactiver la fonctionnalité des boutons.
Ça marche pour moi. YMMV.
Utilisation: Cela doit être fait APRÈS l'initialisation de la source. Un bon endroit est d'utiliser l'événement SourceInitialized de la fenêtre:
Pour désactiver la fonctionnalité Alt + F4, la méthode la plus simple consiste simplement à câbler l'événement Canceling et à définir un indicateur lorsque vous voulez vraiment fermer la fenêtre.
la source
Code XAML
devrait marcher
Modifier - pour l'instant, ce fil montre comment cela peut être fait, mais je ne pense pas que Window ait une propriété pour obtenir ce que vous voulez sans perdre la barre de titre normale.
Edit 2 Ce fil montre un moyen de le faire, mais vous devez appliquer votre propre style au menu système et il montre comment vous pouvez le faire.
la source
Essayez d'ajouter un événement de fermeture à la fenêtre. Ajoutez ce code au gestionnaire d'événements.
Cela empêchera la fermeture de la fenêtre. Cela a le même effet que de masquer le bouton de fermeture.
la source
Utilisez ceci, modifié depuis https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
la source
Cela ne masque pas le bouton mais empêche l'utilisateur d'avancer en fermant la fenêtre.
la source
ensemble de propriétés de fenêtre goto
vous n'obtiendrez pas de boutons de fermeture ...
la source
WindowStyle = "None"
- regardez votre syntaxe. Pour un autre, c'est une approche au fusil de chasse qui supprime également la barre de titre, rendant la boîte moche et sans titre, alors qu'il existe de bien meilleures façons de gérer cela (comme en témoignent les autres réponses), et est une réponse en double.Comme indiqué dans d'autres réponses, vous pouvez utiliser
WindowStyle="None"
pour supprimer complètement la barre de titre.Et, comme indiqué dans les commentaires de ces autres réponses, cela empêche la fenêtre d'être déplaçable, il est donc difficile de la déplacer de sa position initiale.
Cependant, vous pouvez résoudre ce problème en ajoutant une seule ligne de code au constructeur dans le fichier Code Behind de la fenêtre:
Ou, si vous préférez la syntaxe Lambda:
Cela rend la fenêtre entière glissable. Tous les contrôles interactifs présents dans la fenêtre, tels que les boutons, fonctionneront toujours normalement et n'agiront pas comme des poignées de déplacement pour la fenêtre.
la source
Après avoir longuement cherché la réponse, j'ai élaboré cette solution simple que je partagerai ici dans l'espoir qu'elle aide les autres.
Je mets
WindowStyle=0x10000000
.Ceci définit les valeurs
WS_VISIBLE (0x10000000)
etWS_OVERLAPPED (0x0)
pour le style de fenêtre. "Overlapped" est la valeur nécessaire pour afficher la barre de titre et la bordure de la fenêtre. En supprimant laWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
, et lesWS_SYSMENU (0x80000)
valeurs de ma valeur de style, tous les boutons de la barre de titre ont été supprimés, y compris le bouton Fermer.la source
WindowStyle
est une énumération dont les valeurs ne correspondent pas aux constantes de l'API Windows; contraindre la valeur à l'WindowStyle
énumération ne fonctionnera pas. Pour être sûr, j'ai vérifié le code source .NET dans ILSpy; la valeur enum est traduite en API Windows dans la fonction privéeCreateWindowStyle
, et si la fonction rencontre uneWindowStyle
valeur inconnue , elle s'applique simplementWindowStyle.None
. (La seule façon serait d'utiliser les propriétés internes_Style
et d'_StyleEx
utiliser la réflexion, ce que je déconseille fortement.)Utilisez
WindowStyle="SingleBorderWindow"
, cela masquera le bouton max et min de la fenêtre WPF.la source
close
boutonSi le besoin est uniquement d'interdire à l'utilisateur de fermer la fenêtre, c'est une solution simple.
Code XAML:
IsCloseButtonEnabled="False"
la source