c# – 如何优先处理WPF文本框自动缩放?

前端之家收集整理的这篇文章主要介绍了c# – 如何优先处理WPF文本框自动缩放?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些情况下,我有面板或网格自动调整大小,但如果它们包含一个TextBox与TextWrapping =“Wrap”,TextBox继续扩展的面板/网格到很久以前真正需要,如下图:

我想要做的是让TextBox通过包装文本来填充它的区域,然后再尝试向右扩展.一个简单的例子是:

<Grid>
    <Grid Background="Black" />
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <TextBox TextWrapping="Wrap" Height="120" MinWidth="200" />
    </Grid>
</Grid>

我在SO here上发现了一个类似的问题,但是发布的最佳解决方案不允许TextBox扩展.那个解决方案就像:

<Grid>
    <Grid Background="Black">
    </Grid>
    <Grid VerticalAlignment="Top" HorizontalAlignment="Left" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Border BorderThickness="0" x:Name="border" Margin="0.5" />
        <TextBox TextWrapping="Wrap" Height="120" MinWidth="200" Width="{Binding ActualWidth,ElementName=border}" />
    </Grid>
</Grid>

除了通过修改行为扩展TextBox以外的任何想法?谢谢!

解决方法

虽然我不建议这样做,因为我认为这会给用户带来意想不到的行为,这似乎实现了你所要求的:

XAML:

< TextBox ... MinHeight =“120”Width =“200”SizeChanged =“TextBox_SizeChanged”/>

代码背后:

private void TextBox_SizeChanged(object sender,SizeChangedEventArgs e)
{
    try
    {
        if (e.PrevIoUsSize == Size.Parse("0,0")) return;
        if (e.PrevIoUsSize == e.NewSize) return;

        if (e.HeightChanged)
        {
            ((TextBox)sender).Width = e.PrevIoUsSize.Width + 20;
        }
    }

    finally
    {
        e.Handled = true;
    }
}

需要注意的几件事情,1)为了使其工作,您必须同时使用MinHeight和Width来扩展,2)20的水平扩展只是我用于测试目的的任意值;你会想出一种更可靠的计算变量扩展值的方法.

猜你在找的C#相关文章