Comment Étirer WPF Onglet en-Têtes des éléments de Contrôle Parent Largeur
Est-il un moyen dans le code XAML pour provoquer l'onglet en-têtes des éléments à étirer sur toute la largeur de l'onglet contrôle?
Par exemple, j'ai trois onglets: rouge, bleu et vert. Si j'ai un contrôle onglet avec sa largeur est définie sur automatique, l'onglet en-têtes ne prendra qu'une partie de l'espace au-dessus du contenu de l'onglet, mais je veux qu'ils remplissent tout l'espace. Pour mes trois onglet exemple, le rouge doit tenir le premier tiers de la commande, le bleu doit tenir le centre de tiers, et en vert le dernier tiers.
J'ai une idée de comment faire cela dans un code derrière lequel je travaille actuellement, mais je suis intéressé à faire cela de la manière la plus simple possible.
Vous devez vous connecter pour publier un commentaire.
J'ai pris de la Jordanie exemple et fait quelques modifications. Cette version devrait fonctionner pour n'importe quel nombre d'onglets:
Même espace de noms dans le code xaml:
Et ceci tous les onglets de l'utiliser:
return (width <= 1) ? 0 : (width - 1);
dans le cas où la largeur est comprise entre 0 et 1 pour éviter un résultat négatif.return (width <= 1) ? 0 : (width - 1.34);
qui semble prendre soin de tous les nombres de l'onglet articles.MultiBinding
? Désolé, je ne peux vraiment pas en dire beaucoup à ce point.return (width <= 1) ? 0 : (width - 1);
àMath.Max(0, width)
IMultiValueConverter
et pas unIValueConverter
est que sans la deuxième liaison àActualWidth
la liaison va se lier avant le contrôle est rendu, résultant enActualWidth
toujours être à zéro à l'intérieur du convertisseur. L'ajout de la deuxième liaison àActualWidth
forces de la liaison à réévaluer à chaque fois que la largeur de la mèreTabControl
changements. C'est un peu un bodge, mais il fonctionne.Tout le monde semble aller pour le convertisseur de route, mais c'est vraiment aussi simple que d'utiliser un
UniformGrid
avecRows
la valeur 1 dans leTabControl
modèle, en lieu et place de laTabPanel
. Bien sûr, vous devrez re-modèle, mais ce n'est pas trop mauvais.J'ai été en mesure de le faire à l'aide d'un Convertisseur comme suit:
Puis ajouter l'espace de noms pour mon xaml:
Puis de faire tous les TabItems utiliser le convertisseur:
x_Grid est le x:Nom de l'élément parent, je veux les onglets en 1/4 de, si cela fait sens.
Il est possible par la liaison de la largeur de la ActualWidth de la mère de l'onglet contrôle, comme illustré ci-dessous.
Je l'ai enveloppé dans un style à appliquer à toutes les pages à onglet.
Je suis un vieux style de l'école guy. et préfèrent ce type de fonctionnalité à encapsuler dans le code de la contrôle de lui-même. Mon dérivé de contrôle ressemble à ce qui suit:
et mon XAML ressemble
Quelqu'un peut m'expliquer pourquoi tout le monde préfère le style de contrôle au lieu de tirer.
J'ai résolu ce problème en créant un convertisseur spécial:
Et je calculer la valeur d'un onglet de l'élément dans la Balise de l'élément de la TabControl, pour éviter de calculer pour chaque onglet. Voici un exemple de code (à Noter que Dans mon cas, j'avais besoin d'une horizontale ScrollViewer, parce que j'ai plusieurs onglet éléments, et avec une largeur minimum):
Je peux dire que cela fonctionne comme un charme dans mon cas 🙂
J'espère que quelqu'un sera utile!
P. S. je n'ai pas besoin de tout style dans mon cas.
Voici une solution indolore qui utilise des Modèles uniquement:
Espère que j'ai inclus toutes les couleurs et il va travailler pour vous. Ahh... Clin D'Oeil! Mon Désaturation En Effet! Mon WPF projet de démarrage vous pouvez vous saisir de cet effet à partir de là, si vous le souhaitez (Il est plus facile de plop l'effet déclencheur, que pour changer la couleur de la chose, même avec des reflets).
Oui, c'est beaucoup de code, mais j'ai simplement changé ItemsContainer à regarder mieux et remplacé le contrôle d'en-Tête avec UniformGrid et de définir des Lignes ou des Colonnes à 1 selon TabStripPlacement. Maintenant, je peux effondrement du présent code, ou de le cacher quelque part. 🙂
J'ai suivi Charlie suggestion et est allé sur la re-création de modèles de route. Voici un exemple simple de mise en œuvre de
TabControl
qui divise l'espace disponible de manière égale entre sesTabItem
s, à l'aide deUniformGrid
:Du contrôle XAML
Du contrôle de Code-Behind
Que c'est. Vous pouvez maintenant ajouter
TabItem
s à ce contrôle et qu'ils vont ajuster leur largeur automatiquement. Pas besoin de préciserGrid.Column
pour cesTabItem
s soit, ils fonctionnent très bien sans elle, même au moment de la conception.UniformGrid.Columns
(c'est ce queUniformGrid
n'). Notez également que nous ne pouvons pas définir RowDefinition0 hauteur pour le nombre statique puisque l'utilisateur peut utiliser des en-têtes de hauteur. Enfin, dans le cas où vous downvoted la réponse, il est toujours gentil et attentionné pour demander l'OP, si vous ne comprenez pas quelque chose dans une réponse.Margin
paramètre ne devrait pas avoir été là; ne sais pas comment il a fait son chemin à travers. Deuxièmement,Grid.Row
doit avoir été0
, pas1
. Autre que ces deux-là, reste de la les choses sont corrects et que le travail absolument parfait pour moi.Grid.Row
à0
ainsi dans mon code. RéglageRowDefinition0
hauteur Automatique ne fonctionne pas. Dans mon cas, je l'ai mis à 40 parce que je voulais un peu plus grand et le plus évident des onglets. Je suis content d'avoir pu l'aider à améliorer la réponse.TabControl
dans un projet distinct au sein de votre solution. Si vous ne le faites pas, lorsque vous essayez d'ajouter plus d'un onglet à l'TabControl
, vous pouvez rencontrer une erreur cryptiqueThe property 'content' can only be set once.
Au moins dans mon cas, j'ai rencontré cette erreur, et il a été résolu en plaçant la coutume TabControl dans son propre projet au sein de la solution. Le projet compilé amende et a couru avec l'effet désiré. C'est seulement au moment de la conception d'erreur. Mais ennuyeux, cependant.Height
sur leUniformGrid
à 40 serait mieux que sur laRowDefinition
, cependant. Les deux ont le même effet, mais sa mise en place surUniformGrid
est probablement la meilleure approche.Je ne sais pas si cela fonctionnera pour les onglets, mais chaque fois que j'ai besoin d'étirer quelque chose pour remplir un conteneur, j'ai utilisé un ViewBox. Est-ce le genre de chose que vous cherchez?
Je suis en utilisant la solution suivante:
Dans la fenêtre principale, j'utilise une fenêtre de re de la taille de l'événement et sur le tabcontrol Initialisé événement pour définir la Largeur de chaque Onglet. Le nombre " 5 " correspond à mon nombre d'Onglets.
En plus de Ryan Versaw de la solution retenue, qui donne l'égalité de tabItem en-tête de largeurs, j'ai trouvé la suite de façon à le rendre dépendant de la longueur de chaque en-tête.
Nous avons d'abord obtenir la chaîne de caractères de chaque tabItem-tête en ajoutant cette ligne dans le code xaml de multibinding. Il devient donc:
Et un peu plus de code dans le Convertisseur (valeurs[] devient également le tabItem en-Tête):
Je pense qu'il y peut-être un moyen plus efficace pour obtenir le AllHeaders chaîne de tous les en-têtes, mais il fonctionne très bien comme il est ...