【问题标题】:wpf textblock, maximum height - prefered widthwpf 文本块,最大高度 - 首选宽度
【发布时间】:2017-07-21 16:54:06
【问题描述】:

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

现在就我而言,我有一个文本块,其中可能包含相当多的信息。可以缠绕。我希望该信息包含在指定的“行”中 - 最大高度。然而,文本块也应该遵守“首选”宽度——如果需要,宽度可以增长。

因此:首先换行并在保持宽度的同时增加高度。然后,一旦高度达到某个值,就停止增长并开始加宽。

到目前为止我所拥有的是(为TextBlockTextWrapping 导入相关库):

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

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

【问题讨论】:

    标签: c# wpf textblock


    【解决方案1】:

    您可能正在寻找这样的乞丐:

    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 分)。

    【讨论】:

      【解决方案2】:

      我想我理解正确。

      标记

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-11
        • 2013-09-23
        • 1970-01-01
        • 2011-01-20
        • 2014-02-27
        • 1970-01-01
        • 2018-03-03
        • 2013-05-23
        相关资源
        最近更新 更多