2017-03-02 27 views
0

wpf의 텍스트 블록에 대해 최소, 최대 및 실제 너비/높이를 쉽게 설정할 수 있습니다.wpf textblock, 최대 높이 - 선호 너비

내 경우에는 잠재적으로 꽤 많은 정보가 포함 된 텍스트 블록이 있습니다. 어느 쪽이 감쌀 수 있습니다. 정보가 지정된 "줄"에 포함되기를 바랍니다. 최대 높이입니다. 그러나 텍스트 블록은 "선호"너비를 따라야합니다. 필요한 경우 너비가 커질 수 있습니다.

따라서 첫 번째 단어를 감싸고 너비를 유지하면서 높이를 증가 시키십시오. 그런 다음 높이가 특정 가치가되면 성장을 멈추고 확대를 시작하십시오. 내가 지금까지 무엇을 가지고

은 (TextBlockTextWrapping에 대한 관련 라이브러리 가져 오기)된다

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

을 분명히 텍스트 그냥 오버 플로우 afterwich 높이가 단지 최대 성장이 그냥 "수정"는 Width을.

답변

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> 

코드 :

당신은 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(); 
    }