WPF TextBox จะไม่กรอกข้อมูลใน StackPanel


96

ฉันมีตัวTextBoxควบคุมภายในStackPanelซึ่งOrientationถูกตั้งค่าเป็นHorizontalแต่ไม่สามารถรับ TextBox เพื่อเติมเต็มพื้นที่ 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ควบคุมฉันแค่สับสนเกี่ยวกับเค้าโครง

คำตอบ:


148

ฉันมีปัญหาเดียวกันกับStackPanelพฤติกรรมคือ "ตามการออกแบบ" StackPanelมีไว้สำหรับ "การเรียงซ้อน" สิ่งต่างๆแม้จะอยู่นอกพื้นที่ที่มองเห็นได้ดังนั้นจึงไม่อนุญาตให้คุณเติมช่องว่างที่เหลือในมิติการซ้อนกัน

คุณสามารถใช้DockPanelกับLastChildFillset to 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

อย่างจริงจังนี่คือการออกแบบ? ดูเหมือนจะแปลกเนื่องจากเห็นได้ชัดว่าตัวควบคุมนั้นครอบคลุมความกว้างทั้งหมด คุณกำลังบอกว่าพื้นที่เนื้อหาไม่จำเป็นต้องเหมือนกับพื้นที่ที่มองเห็น?
แฮงค์

1
@peter ไม่ได้ทำ wpf มานานแล้ว แต่คุณอาจลองใช้ตารางบางประเภทกับคอลัมน์แรกที่ตั้งค่าเพื่อใช้พื้นที่ว่าง ( stackoverflow.com/questions/12432189/… )
Zach Johnson

6
ฉันมางานปาร์ตี้ที่นี่สายเล็กน้อย แต่ @peter: คุณสามารถใช้FlowDirection="RightToLeft"กับDockPanelเด็กคนสุดท้ายของคุณจะเป็นคนที่เหลือโดยใช้พื้นที่ที่เหลือ
Dennis

17

ฉันอยากจะแนะนำให้ใช้ Grid แทน:

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

เป็นสิ่งที่จำเป็น เพียงแค่แน่ใจว่าคุณลบไฟล์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.