2009-05-19 7 views
9

J'ai besoin d'aide. Je ne sais pas si c'est possible. Je veux avoir ce qui suit:wpf textbox textwrapping

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <TextBox TextWrapping="Wrap" MinLines ="5"/> 
    </Grid> 

qui est un emballage de zone de texte à l'intérieur d'une colonne de la grille avec la largeur *. Je veux que la boîte de texte prenne toute la largeur disponible (d'où *) mais quand un utilisateur ajoute du texte, je veux qu'il s'enroule quand il arrive à la fin de la ligne (avec l'espace disponible).

Actuellement ce qui précède donnera une zone de texte avec toute la largeur, mais lorsque le texte est entré, la largeur de la zone de texte ne fait que croître avec le texte.

Je sais que je peux définir MaxWidth = ?, mais le point que la colonne est * est que je ne sais pas quelle est la taille de la colonne.

Je voudrais dire à la zone de texte "ne pas grandir, tout ce que wpf vous donne le prend et n'augmente pas un pixel de plus au-dessus de ça". Je pense que ce que je veux est impossible, parce que wpf demande au contrôle quelle taille il veut être et quand l'utilisateur ajoute plus de texte qui dépasse la limite il demande gentiment plus d'espace et étend sa largeur à l'infini.

Répondre

9

Essayez de lier la propriété MaxWidth de votre TextBox à la propriété ActualWidth de votre colonne (vous devrez nommer votre colonne pour ce faire). Je suis presque sûr d'avoir fait quelque chose comme ça dans le passé.

Quelque chose comme:

MaxWidth={Binding ElementName=MyColumn, Path=ActualWidth} 

Bonne chance!

+0

Cela semble correct, mais cela ne fonctionne pas parce que la propriété ActualWidth de la ColumnDefinition n'est pas DependencyProperty et MaxWidth sera toujours 0. Testé juste maintenant ... – Vale

0

Semble fonctionner correctement pour moi lorsque j'ai défini Grid.Column="1" sur la zone de texte.

+0

+1 Bon appel, je n'ai pas remarqué que le TextBox n'a pas été dit d'être affiché dans la deuxième colonne (comme il l'a l'intention). :) – Pwninstein

+0

Je suppose qu'il le veut dans la colonne 0. – Crispy

+0

Il déclare ci-dessus: "... qui est un emballage de zone de texte à l'intérieur d'une colonne de la grille avec la largeur *". La colonne avec Width = "*" est la deuxième colonne (Grid.Column = "1"). – Pwninstein

0

En plus de ce RandomEngy dit à propos Grid.Column="1", vous pouvez également définir certaines propriétés d'alignement sur lui-même Grid, en particulier si elle est définie dans un autre récipient avec un comportement différent enfant Stretch (par exemple un StackPanel).

+0

"Quelques propriétés d'alignement"? Lesquels, et à quoi? – Anthony

+0

@ Anthony: Cela dépend de la façon dont la grille elle-même est hébergée. Le comportement de dimensionnement d'un élément WPF dépend non seulement de l'élément lui-même, mais également de l'élément qui l'héberge. Pour voir cela en action, créez un bouton (w/text) à l'intérieur d'un StackPanel, à l'intérieur d'une fenêtre. Changez l'orientation du StackPanel et observez la différence dans le comportement de dimensionnement du bouton ... – micahtan