【问题标题】:Width of Textbox, which placed in grid column, extends when inserting long text放置在网格列中的文本框的宽度在插入长文本时扩展
【发布时间】:2020-03-25 03:55:40
【问题描述】:

当我将文本框放在如下网格列中时

<StackPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" MinWidth="115"/>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="90"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="hello"/>
        <TextBox Grid.Column="1" />
        <Button Grid.Column="2" Content="push me"/>
    </Grid>
</StackPanel>

我得到了正确的结果,即文本框宽度是从父网格获得的

但是当我输入长文本时,文本框开始超出其列,并且在几个额外的字母后停止延伸

到 .Net 4.6.2,我得到相同的结果,但更改为 .Net 4.7.2 问题得到解决,即文本框宽度没有改变。 我的软件是.Net 4.0编译的,有没有解决低于4.7.2的.net的解决方案?

尝试了 Pavel 的第一个想法:删除 stackpanel 并在其中添加另一个网格行,但在 .net 4.6.2 中仍然无法正常工作

尝试了 Pavel 的第二个想法:将第一列的宽度设为“Auto”而不是“1*”。这行得通,文本框没有扩展(.net 4.6.2),但是我真的希望第一列和第二列能够响应调整大小。

【问题讨论】:

  • StackPanel 有什么用?删除它,它应该可以按预期工作
  • @NawedNabiZada 我删除了堆栈面板,问题存在。顺便说一句,StackPanel 就在那里,所以我可以将许多这样的输入字段放在一起,否则一个网格会填满整个窗口。
  • 您可以将 RowDefinition 添加到您的 Grid 中,将 TextBox 的 Horizo​​ntalAlignment 设置为 Stretch。 StackPanel 仅填充必要的空间,在您的情况下,它填充 TextBox 所需的空间并在您向 TextBox 添加文本时扩展 Grid
  • @Sorush 您可以将网格行高设置为自动以适应其内容,看看我的回答
  • 我修改了尺寸。

标签: wpf xaml


【解决方案1】:

您可以通过删除StackPanel 并将RowDefinition 添加到Grid 来解决此问题。也可以设置TextWrapping="Wrap"TextBox 用于换行

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="3*"/>
            <ColumnDefinition Width="90"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0" Text="hello" MinWidth="115"/>
        <TextBox Grid.Column="1" TextWrapping="Wrap"/>
        <Button Grid.Column="2" Content="push me"/>
    </Grid>

StackPanel Y 维度受限于内容,会自动展开到其内容,更多详情请见panels overview

【讨论】:

  • 如果改变 我得到相同的结果
  • @Sorush 更新,行为相同。其实第一个ColumnDefinition没有多大意义,你可以使用Width="Auto"并限制texblock本身的最小宽度
  • 您的最后一次编辑通过设置第一列 Width="Auto" 来工作。但是我希望在调整窗口大小时能够响应字段宽度,因为我使用了 width="1star"。
  • 如果限制列的最小或最大宽度,该列内的所有元素都会受到影响
  • 请查看更新后的问题。我认为你的努力很有帮助。但我会等待其他答案。
【解决方案2】:

对我来说这是一个错误,文本框文本大小可以改变其父宽度(网格宽度)。这发生在 VS2019 .Net 4->4.6.2 中,但不在 .Net 4.7.2 中及之后。

对于任何面临这个问题的人,我通过定义一个包含文本块的不可见网格找到了以下解决方法。我得到列的宽度并将它们提供给放置在 StackPanel 中的控件。

 <some container>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition  Width="1*" MinWidth="115"/>
                <ColumnDefinition  Width="3*" />
                <ColumnDefinition  MinWidth="90"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="0"/>
            </Grid.RowDefinitions>
            <TextBlock x:Name="C0" Grid.Column="0" />
            <TextBlock x:Name="C1" Grid.Column="1" Margin="5"/>
            <TextBlock x:Name="C2" Grid.Column="2" />
        </Grid>


        <StackPanel Orientation="Horizontal">
            <TextBlock Width="{Binding ElementName=C0, Path=ActualWidth }" Text="hello" />
            <TextBox Width="{Binding ElementName=C1, Path=ActualWidth }" Margin="5" />
            <Button Width="{Binding ElementName=C2, Path=ActualWidth }" Content="push me"/>
        </StackPanel>
    </some container>

网格中的列和 StackPanel 中的控件的边距应该相同(参见第二列)。

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多