繁体   English   中英

wpf文本块,最大高度-首选宽度

[英]wpf textblock, maximum height - prefered width

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

现在,以我为例,我有一个文本块,其中可能包含很多信息。 可以包裹起来。 我希望该信息包含在指定的“行”中-最大高度。 但是,文本块还应遵循“首选”宽度-但是,如果需要,宽度可以增长。

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

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

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

显然,这只是“固定”了Width ,在文本溢出后,高度仅增长到最大。

我想我正确理解了你。

标记

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

您可能正在寻找这样的行为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM