2017-03-02 223 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(); 
    } 
相關問題