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

我有一些情况下,我有面板或网格自动调整大小,但如果它们包含一个TextBoxtextwrapping =“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的水平扩展只是我用于测试目的的任意值;你会想出一种更可靠的计算变量扩展值的方法.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...