2017-03-02 190 views
0

对于wpf中的文本块,可以(轻松地)设置最小值,最大值和实际宽度/高度。wpf textblock,最大高度 - 首选宽度

现在在我的情况下,我有一个可能相当多的信息的文本块。哪些可以缠绕。我希望信息被包含在一个特定的“行” - 最大高度。然而,textblock也应该遵循“优先”宽度 - 如果需要,宽度可以增长。

因此:在保持宽度的同时,首先包裹并长高。然后一旦身高达到一定值,停止增长并开始扩大。

我有什么到目前为止是(进口相关库TextBlockTextWrapping):

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

显然,这只是“修复”的Width,其中高度只增长到最大值afterwich文本只是溢出。

回答

0

你可能会寻找像这样的begavior:

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; 

    } 
} 

请注意,根据当前最大宽度测量临时TextBlock。使用其所需的尺寸,我们可以决定是增加最大宽度还是无所事事。

您应该设置MaxHeightMaxWidth属性。测试:

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

和代码:

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

您可能需要更改出头的克隆文本块或更改逻辑或改变步长(我在这里选择10分)。

0

我想我正确地理解了你。

标记

<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> 

代码

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(); 
    } 
相关问题