WPF TextBox가 StackPanel을 채우지 않습니다.


94

나는이 TextBox내에서 제어 StackPanel누구 Orientation로 설정되어 Horizontal있지만, 나머지 StackPanel의 공간을 채우기 위해 텍스트 상자를 얻을 수 없습니다.

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>

그리고 이것은 다음과 같습니다.

대체 텍스트

TextBox가 StackPanel을 채우지 않는 이유는 무엇입니까?

컨트롤을 사용하여 더 많은 컨트롤을 가질 수 있다는 것을 알고 Grid있지만 레이아웃에 대해 혼란스러워합니다.

답변:


146

에서 동일한 문제가 발생 StackPanel했으며 동작은 "설계 상"입니다. StackPanel는 보이는 영역 외부에서도 사물을 "스택"하기위한 것이므로 스태킹 차원에서 남은 공간을 채울 수 없습니다.

DockPanelwith LastChildFillset을 사용하고 true모든 비 채우기 컨트롤을에 도킹하여 Left원하는 효과를 시뮬레이션 할 수 있습니다.

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

7
명확히하기 위해-LastChildFill은 기본적으로 "True"로 설정되어 있고 HorizontalAlignment를 TextBox에 대해 늘이기 위해 설정해도 효과가 없습니다. :-)
Goblin

1
@Goblin : 예 ... OP의 코드를 복사하여 붙여 넣었지만 HorizontalAlignment. :)
Zach Johnson

진지하게, 이것은 의도 된 것입니까? 컨트롤 자체가 분명히 전체 너비에 걸쳐 있기 때문에 이상하게 보입니다. 콘텐츠 영역이 가시 영역과 반드시 ​​동일하지는 않다는 말입니까?
Hank

1
@peter는 오랫동안 wpf 작업을 수행하지 않았지만 사용 가능한 공간을 차지하도록 설정된 첫 번째 열로 일종의 그리드를 시도 할 수 있습니다 ( stackoverflow.com/questions/12432189/… )
Zach Johnson

6
나는 늦은 여기에 파티에 작은하지만 @ 피터 오전 : 당신이 사용할 수있는 FlowDirection="RightToLeft"DockPanel마지막 아이가 남은 공간을 사용하여, 왼쪽 하나가 될 수 있도록.
Dennis

16

대신 그리드를 사용하는 것이 좋습니다.

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

이 문제를 해결하는 다른 방법은 레이블을 오른쪽 대신 위에 쌓는 것입니다. UWP에는 WPF에 대한 헤더 속성이 있는지 확실하지 않은 데 사용할 수있는 기본 제공 헤더 속성이 있습니다.

<TextBox Header="MyLabel" />

2

실제 주제별 이전 질문 :

HorizontalAlignment="Stretch"

필수입니다. 반드시 당신이를 제거하는 것이 될 Juste width.


1

다음을 사용하여 StackPanel을 텍스트 상자로 채울 수 있습니다.

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

텍스트 상자 가로 채우기 스택 패널


예,하지만 수평 스택 패널에는 없습니다. 당신은 수직적입니다 :-)
JB. 모니카 랑.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.