165 votes

WPF: Définir la largeur (et la hauteur) en tant que valeur en pourcentage

Dites que je veux qu'un TextBlock ait sa Width égale à celle de son conteneur parent (c'est-à-dire, s'étendre de gauche à droite) ou à un pourcentage de la Width de son conteneur parent, comment puis-je accomplir cela en XAML sans spécifier des valeurs absolues ?

Je veux faire cela de sorte que si le conteneur parent est ensuite agrandi (sa Width augmentée), ses éléments enfants seront également automatiquement agrandis. (basiquement, comme en HTML et CSS)

0 votes

Jetez un œil à cette réponse.

0 votes

Utilisez la réponse de cwap et incluez le tb dans une grille en réglant son alignement sur stretch.

248voto

cwap Points 6098

Vous pouvez placer les zones de texte à l'intérieur d'une grille pour effectuer des calculs en pourcentage sur les lignes ou colonnes de la grille et laisser les zones de texte se remplir automatiquement dans leurs cellules parent (comme c'est le cas par défaut). Exemple :

Cela fera en sorte que le #1 soit à 2/5 de la largeur, et le #2 à 3/5.

7 votes

J'ai déjà essayé cela, mais je reçois cette erreur : 'Chaîne '2*' ne peut pas être convertie en Longueur.'

0 votes

Votre réponse m'a beaucoup aidé, merci! J'ai essayé de comprendre ce que le * faisait depuis des années, vous l'avez expliqué si brièvement et si bien.

1 votes

:-) ,... le * est appelé "étoile"

100voto

gcores Points 6618

La façon de l'étirer pour qu'il ait la même taille que le conteneur parent est d'utiliser l'attribut :

`

Cela permettra à l'élément Textbox de s'étirer horizontalement et de remplir tout l'espace parent horizontalement (en réalité, cela dépend du panneau parent que vous utilisez, mais cela devrait fonctionner pour la plupart des cas).

Les pourcentages ne peuvent être utilisés qu'avec les valeurs de cellule de grille, donc une autre option est de créer une grille et de placer votre zone de texte dans l'une des cellules avec le pourcentage approprié.

`

64voto

kvb Points 35490

Typiquement, vous utiliseriez un contrôle de mise en page intégré approprié à votre scénario (par exemple, utilisez une grille comme parent si vous voulez un redimensionnement relatif au parent). Si vous souhaitez le faire avec un élément parent arbitraire, vous pouvez créer un ValueConverter pour le faire, mais ce ne sera probablement pas aussi propre que vous le souhaiteriez. Cependant, si vous en avez absolument besoin, vous pourriez faire quelque chose comme ceci :

public class PercentageConverter : IValueConverter
{
    public object Convert(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        return System.Convert.ToDouble(value) * 
               System.Convert.ToDouble(parameter);
    }

    public object ConvertBack(object value, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Que vous pouvez utiliser comme ceci, pour obtenir un enfant textbox de 10 % de la largeur de son parent canvas :

0 votes

C'est vraiment cool, comment puis-je le faire en code (définir la largeur de la zone de texte) ?

10 votes

Vous devriez envisager d'ajouter CultureInfo.InvariantCulture à la conversion double car le paramètre est considéré comme une chaîne et dans les cultures avec un séparateur décimal différent, cela ne fonctionnera pas comme prévu.

0 votes

En cherchant ce sujet, je suis tombé sur cette réponse : stackoverflow.com/a/59934565/7108481 qui fait à peu près la même chose mais a poussé le concept plus loin en implémentant une propriété attachée.

39voto

Zain Ali Points 3813

Pour toute personne qui rencontre une erreur comme : La chaîne '2*' ne peut pas être convertie en Longueur.

    Votre bloc de texte a :
    Votre bloc de texte b :

0 votes

Pourquoi ne pas ?

2 votes

"auto" prend seulement autant d'espace que le contrôle a besoin

0 votes

Merci beaucoup, ceci devrait être la meilleure réponse.

4voto

Crippeoblade Points 1301

Je sais que ce n'est pas du XAML, mais j'ai fait la même chose avec l'événement SizeChanged du textbox :

private void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e)
{
   TextBlock textBlock = sender as TextBlock;
   FrameworkElement element = textBlock.Parent as FrameworkElement;
   textBlock.Margin = new Thickness(0, 0, (element.ActualWidth / 100) * 20, 0);
}

Le textbox semble être à 80% de la taille de son parent (la marge du côté droit étant de 20%) et s'étire selon les besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X