WPF TextBox sẽ không điền vào StackPanel


94

Tôi có TextBoxquyền kiểm soát trong mộtStackPanelOrientationđược thiết lập để Horizontal, nhưng không thể có được TextBox để lấp đầy khoảng trống StackPanel còn lại.

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <StackPanel Background="Orange" Orientation="Horizontal" >
        <TextBlock Text="a label" Margin="5" VerticalAlignment="Center"/>
        <TextBox Height="25" HorizontalAlignment="Stretch" Width="Auto"/>
    </StackPanel>
</Window>

Và đây là những gì nó trông như thế này:

văn bản thay thế

Tại sao TextBox đó không lấp đầy StackPanel?

Tôi biết tôi có thể kiểm soát nhiều hơn bằng cách sử dụng một Gridđiều khiển, tôi chỉ nhầm lẫn về cách bố trí.

Câu trả lời:


146

Tôi đã gặp vấn đề tương tự StackPanelvà hành vi là "do thiết kế". StackPanelđược dùng để "xếp chồng" những thứ ngay cả bên ngoài vùng hiển thị, vì vậy nó sẽ không cho phép bạn lấp đầy không gian còn lại trong kích thước xếp chồng.

Bạn có thể sử dụng DockPanelvới LastChildFillset to truevà gắn tất cả các điều khiển không điền vào Leftđể mô phỏng hiệu ứng bạn muốn.

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >

7
Chỉ cần làm rõ - LastChildFill theo mặc định được đặt thành "Đúng" và việc đặt HorizontalAlignment để kéo dài cho TextBox không có tác dụng. :-)
Goblin

1
@Goblin: Có ... Tôi đã sao chép và dán mã của OP nhưng quên xóa HorizontalAlignment. :)
Zach Johnson

Nghiêm túc mà nói, đây là do thiết kế? Có vẻ kỳ lạ, vì bản thân điều khiển rõ ràng là kéo dài toàn bộ chiều rộng. Bạn đang nói rằng vùng nội dung không nhất thiết phải giống vùng hiển thị?
Hank

1
@peter đã lâu không thực hiện nội dung wpf nhưng bạn có thể thử một số loại lưới với cột đầu tiên được đặt để chiếm không gian có sẵn ( stackoverflow.com/questions/12432189/… )
Zach Johnson

6
Tôi đến bữa tiệc ở đây hơi muộn, nhưng @peter: bạn có thể sử dụng FlowDirection="RightToLeft"trên DockPanel, vì vậy con cuối cùng của bạn sẽ là con còn lại, sử dụng không gian còn lại.
Dennis

16

Tôi khuyên bạn nên sử dụng Grid để thay thế:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="180" Width="324">

    <Grid Background="Orange">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Text="a label" 
           VerticalAlignment="Center"/>
        <TextBox  Grid.Column="1"/>
    </Grid>
</Window>

Một cách khác để giải quyết vấn đề này là xếp nhãn lên trên thay vì ở bên phải. Tôi nhận thấy rằng UWP có một thuộc tính tiêu đề tích hợp mà bạn có thể sử dụng cho điều đó, không chắc liệu thuộc tính tiêu đề có tồn tại cho WPF hay không.

<TextBox Header="MyLabel" />

2

Câu hỏi cũ theo chủ đề thực tế:

HorizontalAlignment="Stretch"

là điều bắt buộc. Juste hãy chắc chắn rằng bạn loại bỏ width.


1

Tôi có thể điền vào StackPanel bằng một hộp văn bản bằng cách sử dụng như sau:

<StackPanel Margin="5,5,5,5">
    <Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
    <TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>

Hộp văn bản điền theo chiều ngang Stackpanel


Có nhưng không phải trong Bảng xếp chồng ngang; của bạn là dọc :-)
JB. Với Monica.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.