Disons que je veux que un TextBlock
soit Width
égal à son conteneur parent Width
(c'est-à-dire, étiré d'un côté à l'autre) ou à un pourcentage de son conteneur parent Width
, comment puis-je accomplir cela XAML
sans spécifier de valeurs absolues?
Je veux faire cela pour que si le conteneur du conteneur parent est ultérieurement développé (son ' Width
augmenté), ses' éléments enfants seront également développés automatiquement. (en gros, comme en HTML et CSS)
Réponses:
La façon de l'étirer à la même taille que le conteneur parent consiste à utiliser l'attribut:
Cela rendra l'élément Textbox s'étirer horizontalement et remplir tout l'espace parent horizontalement (en fait, cela dépend du panneau parent que vous utilisez mais devrait fonctionner dans la plupart des cas).
Les pourcentages ne peuvent être utilisés qu'avec les valeurs de cellule de la grille, une autre option consiste donc à créer une grille et à placer votre zone de texte dans l'une des cellules avec le pourcentage approprié.
la source
Vous pouvez placer les zones de texte dans une grille pour faire des valeurs de pourcentage sur les lignes ou colonnes de la grille et laisser les zones de texte se remplir automatiquement vers leurs cellules parentes (comme elles le feront par défaut). Exemple:
Cela fera n ° 1 2/5 de la largeur et n ° 2 3/5.
la source
En règle générale, vous utilisez un contrôle de mise en page intégré adapté à votre scénario (par exemple, utilisez une grille en tant que parent si vous souhaitez une mise à l'échelle par rapport au parent). Si vous voulez le faire avec un élément parent arbitraire, vous pouvez créer un ValueConverter pour le faire, mais il ne sera probablement pas aussi propre que vous le souhaiteriez. Cependant, si vous en avez absolument besoin, vous pouvez faire quelque chose comme ceci:
Ce qui peut être utilisé comme ceci, pour obtenir une zone de texte enfant de 10% de la largeur de son canevas parent:
la source
CultureInfo.InvariantCulture
à la double conversion car leparameter
est considéré commestring
et dans les cultures avec différentes,decimal separator
il ne fonctionnera pas comme prévu.Pour toute personne qui obtient une erreur telle que: la chaîne '2 *' ne peut pas être convertie en longueur.
la source
<RowDefinition Height="auto" />
?L'implémentation IValueConverter peut être utilisée. La classe de convertisseur qui hérite de IValueConverter prend certains paramètres comme
value
(pourcentage) etparameter
(largeur du parent) et renvoie la valeur de largeur souhaitée. Dans le fichier XAML, la largeur du composant est définie avec celle souhaitée avec la valeur:XAML:
la source
Je sais que ce n'est pas Xaml mais j'ai fait la même chose avec l'événement SizeChanged de la zone de texte:
La zone de texte semble avoir 80% de la taille de son parent (bien la marge du côté droit est de 20%) et s'étire si nécessaire.
la source
J'utilise deux méthodes pour le dimensionnement relatif. J'ai une classe appelée
Relative
avec trois propriétés attachéesTo
,WidthPercent
etHeightPercent
qui est utile si je veux qu'un élément soit une taille relative d'un élément n'importe où dans l'arborescence visuelle et se sent moins piraté que l'approche du convertisseur - bien que vous utilisez ce qui fonctionne pour vous, que vous suis content.L'autre approche est un peu plus rusée. Ajoutez un
ViewBox
où vous voulez des tailles relatives à l'intérieur, puis à l'intérieur, ajoutez unGrid
à une largeur de 100. Ensuite, si vous ajoutez unTextBlock
avec une largeur de 10 à l'intérieur, c'est évidemment 10% de 100.Le
ViewBox
sera mis à l'échelle enGrid
fonction de l'espace qui lui a été donné, donc si c'est la seule chose sur la page, alors leGrid
sera mis à l'échelle sur toute la largeur et effectivement, votreTextBlock
sera mis à l'échelle à 10% de la page.Si vous ne définissez pas de hauteur sur le,
Grid
il se rétrécira pour s'adapter à son contenu, donc tout sera relativement dimensionné. Vous devrez vous assurer que le contenu ne devient pas trop haut, c'est-à-dire qu'il commence à changer le rapport hauteur / largeur de l'espace donné à l'ViewBox
autre, il commencera également à redimensionner la hauteur. Vous pouvez probablement travailler autour de cela avec unStretch
deUniformToFill
.la source