web-dev-qa-db-fra.com

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 contrôles de Telerik et tout fonctionne et semble bien. Malheureusement, nous avons récemment dû remplacer la classe de base de toutes nos boîtes de dialogue, en changeant RadWindow par la fenêtre WPF standard (la raison n'est pas pertinente pour 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 moche lorsqu'elle était utilisée dans l'environnement de notre client (Services Terminal Server sous Windows Server 2008 R2).

RadWindow de Telerik est un contrôle utilisateur standard qui imite le comportement d'une boîte de dialogue afin que le style ne soit pas un problème. Avec la fenêtre de WPF, j'ai du mal à changer sa "bordure". Ce que je veux dire par "bordure" ici, c'est à la fois la barre de titre avec l'icône et les 3 boutons standard (Réduire, Agrandir/Restaurer, Fermer) et la poignée de redimensionnement autour de la fenêtre.

Comment puis-je changer l'apparence de ces éléments:

  • Couleur de la barre de titre
  • 3 boutons standard
  • Couleur réelle de la bordure de la fenêtre

Avec des coins arrondis si possible.

32
Marcel Gosselin

Ce sont des zones "non clientes" et contrôlées par Windows. Voici la documentation MSDN sur le sujet (les informations pertinentes sont en haut).

Fondamentalement, vous définissez WindowStyle = "None" de votre fenêtre, puis créez votre propre interface de fenêtre. ( question similaire sur SO )

27
Muad'Dib

Vous devez définir

WindowStyle="None", AllowsTransparency="True" et éventuellement ResizeMode="NoResize"
, puis définissez la propriété Style de la fenêtre sur votre style de fenêtre personnalisé, dans lequel vous définissez l'apparence de la fenêtre (barre de titre, boutons, bordure) comme vous le souhaitez et affichez le contenu de la fenêtre dans un ContentPresenter.

This semble être un bon article sur la façon dont vous pouvez y parvenir, mais il existe de nombreux autres articles sur Internet.

13
Lescai Ionel

J'ai trouvé une solution plus simple à partir du commentaire @DK dans cette question , la solution est écrite par Alex et décrite ici avec la source, pour créer une fenêtre personnalisée:

  1. téléchargez l'exemple de projet ici
  2. éditez le fichier generic.xaml pour personnaliser la disposition.
  3. prendre plaisir :).
6
Anas

Vérifiez l'exemple suivant WPF personnalisation de l'apparence d'une fenêtre en XAML

Cet exemple montre comment personnaliser entièrement le style/l'apparence d'une fenêtre, y compris les zones non clientes: barre de titre, bordures, max, min et boutons de fermeture tout en offrant toutes les fonctionnalités attendues.

4
Abou-Emish

Si quelqu'un dit que vous ne pouvez pas parce que seul Windows peut contrôler la zone non cliente, il a tort!

C'est juste une demi-vérité car Windows vous permet de spécifier les dimensions de la zone non cliente. Le fait est que cela n'est possible que dans toutes les méthodes du noyau de Windows et que vous êtes en .NET, pas en C/C++. Quoi qu'il en soit, ne vous inquiétez pas! P/Invoke était destiné uniquement à de telles choses! En effet, l'ensemble des méthodes Std-I/O de l'application Windows Form UI et Console sont proposées à l'aide d'appels système. Par conséquent, vous n'auriez qu'à effectuer les appels système appropriés pour configurer la zone non cliente, comme indiqué dans MSDN.

Cependant, c'est une solution vraiment difficile que j'ai trouvée il y a longtemps. Heureusement, à partir de .NET 4.5, vous pouvez utiliser la classe WindowChrome pour ajuster la zone non cliente comme vous le souhaitez. Ici vous pouvez commencer.

Afin de rendre les choses plus simples et plus propres, je vais vous rediriger ici , un guide pour changer les dimensions de la bordure de la fenêtre comme vous le souhaitez. En le définissant sur 0, vous pourrez implémenter votre bordure de fenêtre personnalisée à la place de celle du système.

Je suis désolé de ne pas avoir affiché d'exemple clair, mais plus tard j'en serai sûr.

2
Davide Cannizzo

Je vous suggère de partir d'une solution existante et de la personnaliser pour l'adapter à vos besoins, c'est mieux que de partir de zéro!

Je cherchais la même chose et je tombe sur this solution open source, j'espère que cela vous aidera.