WPF TextBox, StackPanel'i doldurmayacak


96

Bir var TextBoxbir dahilinde kontrolünü StackPanelkimin Orientationayarlandığında Horizontal, ancak kalan StackPanel boşluğu doldurmak için TextBox alınamıyor.

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>

Ve göründüğü gibi:

alternatif metin

Bu TextBox neden StackPanel'i doldurmuyor?

Bir Gridkontrol kullanarak daha fazla kontrole sahip olabileceğimi biliyorum , sadece düzen konusunda kafam karıştı.

Yanıtlar:


148

Aynı sorunu yaşadım StackPanelve davranış "tasarım gereğidir". StackPanel, nesneleri görünür bölgenin dışında bile "istiflemek" içindir, böylece yığınlama boyutunda kalan alanı doldurmanıza izin vermez.

İstediğiniz efekti simüle etmek için a DockPanelile LastChildFillset to kullanabilir trueve tüm doldurulmayan kontrolleri ' Lefte sabitleyebilirsiniz.

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

7
Açıklığa kavuşturmak için - LastChildFill varsayılan olarak "True" olarak ayarlanmıştır ve HorizontalAlignment ayarının TextBox için herhangi bir etkisi yoktur. :-)
Goblin

1
@Goblin: Evet ... OP'nin kodunu kopyalayıp yapıştırdım ama kaldırmayı unuttum HorizontalAlignment. :)
Zach Johnson

Cidden, bu tasarım gereği mi? Garip görünüyor, çünkü kontrolün kendisi belli ki tüm genişliği kapsıyor. İçerik alanının, görünen alanla aynı olması gerekmediğini mi söylüyorsunuz?
Hank

1
@peter uzun zamandır şeyler wpf yapmadım ama kullanılabilir alan (yukarı çekmek için ilk sütun seti ile ızgara çeşit deneyebilirsiniz stackoverflow.com/questions/12432189/... )
Zach Johnson

6
Buradaki partiye biraz geç kaldım, ama @peter: FlowDirection="RightToLeft"üzerinde kullanabilirsiniz DockPanel, böylece son çocuğunuz kalan alanı kullanarak soldaki olacaktır.
Dennis

17

Bunun yerine bir Grid kullanmanızı tavsiye ederim:

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

Bu sorunun üstesinden gelmenin diğer yolu, etiketi sağ yerine üst üste koymaktır. UWP'nin bunun için kullanabileceğiniz yerleşik bir başlık özelliği olduğunu fark ettim, başlık özelliğinin WPF için mevcut olup olmadığından emin değilim.

<TextBox Header="MyLabel" />

2

Gerçek konuya göre eski soru:

HorizontalAlignment="Stretch"

gerekli olan şeydir. Sadece width.


1

Aşağıdakileri kullanarak bir StackPanel'i bir metin kutusuyla doldurabiliyorum:

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

Metin Kutusu Yatay Yığın Panelini Doldurma


Evet ama Yatay Yığın Panelinde değil; seninki dikey :-)
JB. Monica ile.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.