WPF TextBox tidak akan mengisi StackPanel

96

Saya memiliki TextBoxkontrol di dalam StackPanelyang Orientationdisetel ke Horizontal, tetapi tidak bisa mendapatkan TextBox untuk mengisi ruang StackPanel yang tersisa.

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>

Dan seperti inilah tampilannya:

teks alt

Mengapa TextBox itu tidak mengisi StackPanel?

Saya tahu saya dapat memiliki kontrol lebih dengan menggunakan Gridkontrol, saya hanya bingung tentang tata letaknya.

Gulungan
sumber

Jawaban:

148

Saya memiliki masalah yang sama dengan StackPanel, dan perilakunya "sesuai rancangan". StackPaneldimaksudkan untuk "menumpuk" hal-hal bahkan di luar wilayah yang terlihat, sehingga Anda tidak dapat mengisi ruang yang tersisa dalam dimensi tumpukan.

Anda dapat menggunakan DockPaneldengan LastChildFillset ke truedan menggabungkan semua kontrol non-pengisian ke Leftuntuk mensimulasikan efek yang Anda inginkan.

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
Zach Johnson
sumber
7
Hanya untuk memperjelas - LastChildFill secara default disetel ke "True" dan menyetel HorizontalAlignment ke peregangan untuk TextBox tidak berpengaruh. :-)
Goblin
1
@Goblin: Ya ... Saya menyalin dan menempel kode OP tetapi lupa menghapus HorizontalAlignment. :)
Zach Johnson
Serius, ini memang disengaja? Kelihatannya aneh, karena kontrolnya sendiri jelas mencakup seluruh lebar. Apakah Anda mengatakan bahwa area konten belum tentu sama dengan area yang terlihat?
Hank
1
@peter belum melakukan hal-hal wpf dalam waktu yang lama tetapi Anda dapat mencoba semacam kisi dengan kolom pertama disetel untuk mengambil ruang yang tersedia ( stackoverflow.com/questions/12432189/… )
Zach Johnson
6
Saya agak terlambat ke pesta di sini, tetapi @peter: Anda dapat menggunakan FlowDirection="RightToLeft"di DockPanel, jadi anak terakhir Anda akan menjadi yang kiri, menggunakan ruang yang tersisa.
Dennis
17

Saya akan merekomendasikan menggunakan Grid sebagai gantinya:

<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>

Cara lain untuk mengatasi masalah ini adalah dengan menumpuk label di atas, bukan di kanan. Saya perhatikan bahwa UWP memiliki properti tajuk bawaan yang dapat Anda gunakan untuk itu, tidak yakin apakah properti tajuk ada untuk WPF.

<TextBox Header="MyLabel" />
Bill Moore
sumber
2

Pertanyaan lama menurut topik sebenarnya:

HorizontalAlignment="Stretch"

adalah hal yang dibutuhkan. Pastikan Anda menghapus file width.

glihm
sumber
1

Saya dapat mengisi StackPanel dengan kotak teks menggunakan yang berikut ini:

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

Textbox Mengisi Stackpanel Secara Horizontal

Ben
sumber
Ya, tetapi tidak di Stackpanel Horizontal; milikmu vertikal :-)
JB. Dengan Monica.