在 Border, WPF 中的 Stackpanel 中使文本框宽度自动更改

Make textbox width automatically changable in Stackpanel which is in Border, WPF

我想把 Button 放在 TextBox 中,但我发现这是不可能的,所以我决定这样做:

Xaml 看起来如下所示:

<Border Grid.Row="4" Grid.Column="2" Margin="10,0,10,0" 
            BorderBrush="Gray" BorderThickness="1">
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0">
            <TextBox BorderBrush="LightGray" BorderThickness="1" Text="{Binding WaybillNumber}" 
                     Width="245"/>
            <Button  Content="*" Width="15" BorderThickness="1"/>
        </StackPanel>
    </Border>

我遇到的问题是,当我调整 window(减小宽度)大小时,我的 Button 消失了:

我希望它表现得像 DateTimePicker 那样。我尝试了很多方法来使 TextBox 宽度自动调整(* 宽度输入不正确,auto 减小 TextBox 的宽度,我还尝试定义样式资源在 StackPanel 资源中 TextBox 宽度,但它也不起作用),但还没有找到正确的方法。

StackPanel 替换为 Grid:

<Border Margin="10,0,10,0" BorderBrush="Gray" BorderThickness="1">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <TextBox BorderBrush="LightGray" BorderThickness="1" Text="{Binding WaybillNumber}" />
        <Button Grid.Column="1" Content="*" Width="15" BorderThickness="1"/>
    </Grid>
</Border>

使用 Grid 而不是 StackPanel。设置固定大小 (Width/Height) 不是自适应布局的好主意。 Grid 将允许 TextBox 伸展。

一个选项是为 TextBox 和 Button 设置单独的列:

<Border Grid.Row="4" Grid.Column="2" Margin="10,0,10,0" 
        BorderBrush="Gray" BorderThickness="1">
    <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <TextBox BorderBrush="LightGray" BorderThickness="1" Text="{Binding WaybillNumber}" />
        <Button Content="*" Grid.Column="1" Width="15" BorderThickness="1"/>
    </Grid>
</Border>

或者将它们放在同一个单元格中,让 Button 与 TextBox 重叠(它看起来像是 TextBox 的一部分,但可以隐藏部分长文本):

<Border Grid.Row="4" Grid.Column="2" Margin="10,0,10,0" 
        BorderBrush="Gray" BorderThickness="1">
    <Grid>
        <TextBox BorderBrush="LightGray" BorderThickness="1" Text="{Binding WaybillNumber}" />
        <Button Content="*" HorizontalAlignment="Right" Margin="2" Width="15" BorderThickness="1"/>
    </Grid>
</Border>