2017-03-02 1 views
0

Pour les blocs de texte dans wpf, on peut (facilement) définir la largeur/hauteur minimale, maximale et réelle.wpf textblock, hauteur maximale - largeur préférée

Maintenant, dans mon cas, j'ai un bloc de texte avec potentiellement un peu d'information. Qui peut être enroulé autour. Je souhaite que les informations soient contenues sur une "ligne" spécifiée - hauteur maximale. Cependant, le bloc de texte devrait également adhérer à une largeur "préférée" - la largeur peut cependant croître si nécessaire.

Ainsi: le premier mot enveloppe et augmente la hauteur tout en gardant la largeur. Ensuite, une fois que la hauteur est une certaine valeur, arrêtez de la cultiver et commencez à élargir.

Ce que j'ai à ce jour est (importation des bibliothèques pertinentes pour TextBlock et TextWrapping):

var tb = new TextBlock 
tb.TextWrapping = TextWrapping.Wrap; 
tb.Width = 96; 
tb.MaxHeight = 96; 

Il est évident que ce juste « fixe » la Width, où la hauteur pousse juste un maximum afterwich le texte déborde juste.

Répondre

0

Vous cherchez peut-être un begavior comme ceci:

public class TextBlockBehavior : Behavior<TextBlock> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.SizeChanged += AssociatedObject_SizeChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.SizeChanged -= AssociatedObject_SizeChanged; 
    } 

    private void AssociatedObject_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     TextBlock temp = new TextBlock() 
     { 
      Text = AssociatedObject.Text, 
      LineStackingStrategy = AssociatedObject.LineStackingStrategy, 
      LineHeight = AssociatedObject.LineHeight, 
      TextTrimming = TextTrimming.None, 
      TextWrapping = AssociatedObject.TextWrapping, 
      Height = AssociatedObject.Height 
     }; 
     double maxwidth = AssociatedObject.MaxWidth - 10; 
     double desiredHeight = double.PositiveInfinity; 
     while (desiredHeight > AssociatedObject.MaxHeight) 
     { 
      temp.Measure(new Size(maxwidth, double.PositiveInfinity)); 
      maxwidth += 10; 
      desiredHeight = temp.DesiredSize.Height; 
     } 

     AssociatedObject.MaxWidth = maxwidth; 

    } 
} 

Notez qu'un TextBlock temporaire est mesuré en fonction de la largeur maximale actuelle. En utilisant sa taille désirée, nous pouvons décider d'augmenter la largeur maximale ou de ne rien faire. Les propriétés MaxHeight et MaxWidth doivent être définies. Test:

<TextBlock MaxHeight="50" MaxWidth="100" Background="Red" TextTrimming="None" TextWrapping="Wrap" MouseDown="TextBlock_MouseDown"> 
    <i:Interaction.Behaviors> 
     <local:TextBlockBehavior /> 
    </i:Interaction.Behaviors> 
</TextBlock> 

et code:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     ((TextBlock)sender).Text += "AAAA "; 
    } 

Vous devrez peut-être changer somethings dans le clonage du TextBlock ou de changer la logique ou de changer la taille de l'étape (je choisis 10 pts ici).

0

Je crois vous avoir bien compris.

Markup

<Grid> 
    <TextBlock x:Name="Tb" 
       MinWidth="120" MaxWidth="120" MinHeight="23" MaxHeight="100" 
       TextWrapping="Wrap" 
       SizeChanged="TextBlock_SizeChanged_1" 
       Background="#FFEAC9C9"/> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="28,9,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 

</Grid> 

code

private void TextBlock_SizeChanged_1(object sender, SizeChangedEventArgs e) 
    { 
     TextBlock tb = sender as TextBlock; 
     if (tb.ActualHeight >= tb.MaxHeight) 
      tb.MaxWidth += 300; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Tb.Text += DateTime.Now.ToString(); 
    }