Comment puis-je styliser la bordure et la barre de titre d'une fenêtre dans WPF?
nous développons une application WPF qui utilise la suite de commandes de Telerik et tout fonctionne et semble bien. Malheureusement, nous avons récemment dû remplacer la classe de base de tous nos dialogues, en changeant RadWindow par la fenêtre standard WPF (la raison n'est pas pertinente dans cette discussion). Ce faisant, nous avons fini par avoir une application qui semblait toujours jolie sur tous les ordinateurs des Développeurs (Windows 7 avec Aero activé) mais qui était laide lorsqu'elle était utilisée dans l'environnement de notre client (services de Terminal sous Windows Server 2008 R2).
le RadWindow de Telerik est un contrôle d'utilisateur standard qui imite le comportement d'un dialogue si stylé qu'il n'était pas un problème. Mais avec la fenêtre du WPF, j'ai du mal à changer sa "frontière". Ce que je veux dire par "bordure", c'est à la fois la barre de titre avec l'icône et les 3 boutons standard (Minimize, Maximize/Restore, Close) et la poignée redimensionner autour de la fenêtre.
Comment changer l'apparence de ces articles:
- de la barre de Titre de la couleur
- 3 boutons standard
- de la Fenêtre de véritable couleur de la bordure
avec des coins ronds si possible.
6 réponses
ce sont des zones" non-client " et sont contrôlées par Windows. Voici les docs MSDN sur le sujet (l'information pertinente est en haut).
en gros, vous définissez la fenêtre WindowStyle= "None", puis vous construisez votre propre interface de fenêtre. ( question similaire sur SO )
, Vous devez définir le
WindowStyle="None"
, AllowsTransparency="True"
et éventuellement ResizeMode="NoResize"
ensuite, définissez la propriété Style
de la fenêtre à votre style de fenêtre personnalisé, où vous concevez l'apparence de la fenêtre (barre de titre, boutons, bordure) à tout ce que vous voulez et affichez le contenu de la fenêtre dans un ContentPresenter
.
Ce semble être un bon article sur comment vous pouvez le faire, mais il y a beaucoup d'autres articles sur internet.
j'ai trouvé une solution plus simple de @ DK commentaire dans cette question , la solution est écrite par Alex et décrit ici avec source, Pour faire la fenêtre personnalisée:
- télécharger l'exemple de projet ici
- modifier le générique.fichier xaml pour personnaliser la mise en page.
- enjoy:).
Vérifiez les points suivants de l'échantillon WPF personnalisation de l'apparence d'une fenêtre en XAML
cet exemple montre comment personnaliser complètement le style/l'apparence d'une fenêtre, y compris les zones non-client: barre de titre, borders, MAX, min et les boutons de fermeture tout en fournissant toutes les fonctionnalités attendues.
je vous suggère de partir d'une solution de base et de la personnaliser pour répondre à vos besoins, c'est mieux que de partir de zéro!
je cherchais la même chose et je tombe sur ce solution open source, j'espère que ça aidera.
si quelqu'un vous dit que vous ne pouvez pas parce que ce serait la zone non-client et que seules Windows peut contrôler cela, ils se trompent!
C'est juste une demi-vérité parce que Windows vous permet de spécifier des tailles à la zone non-client. Le fait est seulement que cela est possible à travers les méthodes du noyau de Windows, et vous êtes dans .NET, pas C++. De toute façon, ne vous inquiétez pas! P/Invoke est là juste pour une telle chose! Ainsi, vous pouvez invoquer les méthodes du noyau pour configurer la zone non-client.
cependant, c'est une solution très compliquée que j'ai soulevée il y a de nombreuses fois. Heureusement, à partir de .NET 4.5, vous pouvez utiliser la classe WindowChrome
pour configurer la zone non-client comme vous le souhaitez. ici vous pouvez entrer dans MSDN.
afin de rendre les choses plus simples et plus propres, je vais vous rediriger ici , un guide pour changer la taille de la bordure de la fenêtre à ce que vous voulez. Un réglage à 0, vous serez en mesure de mettre en œuvre votre bordure de fenêtre personnalisée à la place de celle du système.
Je m'excuse de ne pas avoir posté un exemple clair, mais plus tard je le ferai à coup sûr.