使 WPF TextBlock 只增长而不收缩?

Making a WPF TextBlock be only grow and not shrink?

在我的应用程序中,我多次设置名为 tbkStatusTextBlockText

如何让 TextBlock 自动增长以适合文本,但在文本更改时不收缩?

StatusText每隔几秒变化一次,有长文和短文的状态。 我希望我的 TextBlock 能够适应最长文本的大小,即使文本很短,TextBlock 也不应缩小

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="400" 
        WindowStartupLocation="CenterScreen" 
        ResizeMode="CanMinimize" Topmost="True">
    <Window.Resources>

    </Window.Resources>
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="AUTO" />
            <RowDefinition Height="AUTO" />
            <RowDefinition Height="AUTO" />
            <RowDefinition Height="AUTO" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Please wait ..." Grid.Row="1" Margin="6"/>

        <TextBlock Name="tbkStatus" Grid.Row="2" Margin="6" TextWrapping="Wrap" Text="{Binding StatusText}"/>

        <ProgressBar Grid.Row="3" Margin="6" Height="20"/>
        <Button Grid.Row="4" HorizontalAlignment="Center" Padding="24,3" Margin="6" Content="Stop"/>
    </Grid>
</Window>

我猜你可以只听 SizeChanged or LayoutUpdated 之类的布局事件或编写某种行为

在下面的例子中,基本前提是监听这两个事件中的任何一个,并且强制你的控件永不收缩

Note this is totally untested and was just an idea, maybe you could set the MinWidth Property instead

Xaml

<TextBlock x:Name="tbkStatus" SizeChanged="OnSizeChanged"/>

代码隐藏

private double _lastSize;

private void OnSizeChanged(object sender, SizeChangedEventArgs e)
{
    var textBlock = sender as TextBlock;
    if (textBlock == null)
    {
        return;
    }

    if (e.WidthChanged)
    {
        if (textBlock.Width < _lastSize)
        {
            textBlock.Width = _lastSize;
        }
        _lastSize = textBlock.Width;
    }
}

另请注意

SizeChangedEventArgs Class 有许多您可以利用的属性

你可以这样做:

 <TextBlock Name="tbkStatus" Grid.Row="2" Margin="6" TextWrapping="Wrap" Text="{Binding StatusText}"/>

因为 TextBlock 没有 TextChange 事件这将完成那个工作

DependencyPropertyDescriptor dp = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
int textLength =0 


dp.AddValueChanged(tbkStatus, (object a, EventArgs b) =>
{
      if (textLength < tbkStatus.Text.Length)
      {
       textLength = tkbStatus.Text.Length;
       tbkStatus.Width = textLength * SomeValue; //You have to play around and see what value suits you best since it depends on font and it's size
      }

});

或者,您可以使用 TextBox 并将其设为只读并使用 TextChanged 事件。

Xaml唯一解:

<TextBlock Text="{Binding StatusText}"
           MinWidth="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}"
           HorizontalAlignment="Left"/>

这样,每当 Width 增长时,MinWidth 也会增长。所以控件不能退缩