จัดเรียงรายการในแผงสแต็ค?


148

ฉันสงสัยว่าฉันสามารถมีตัวควบคุม 2 ตัวใน StackPanel ในแนวนอนหรือไม่เพื่อให้รายการที่เหมาะสมเชื่อมต่อไปทางด้านขวาของ StackPanel

ฉันลองสิ่งต่อไปนี้ แต่มันไม่ทำงาน:

<StackPanel Orientation="Horizontal">
    <TextBlock>Left</TextBlock>
    <Button Width="30" HorizontalAlignment="Right">Right<Button>
</StackPanel>

ในตัวอย่างด้านบนฉันต้องการให้ปุ่มเชื่อมต่อไปทางด้านขวาของ StackPanel

หมายเหตุ: ฉันต้องการให้ใช้ StackPanel ไม่ใช่ Grid เป็นต้น


คุณพูดถึงไม่มีกริดอย่างชัดเจน แต่นั่นเป็นวิธีที่ฉันทำสิ่งนี้ให้สำเร็จ ฉันจะสนใจเพื่อดูว่ามีคนอื่นที่มีคำตอบที่ไม่ใช่ตารางสำหรับคำถามของคุณที่ตรงกับความต้องการของฉันหรือไม่
JMD

ใช่ฉันมีคนให้โครงการที่เต็มไปด้วยกองการติดตั้งด้วยวิธีนี้นั่นคือวิธีที่เขาต้องการให้แก้ไขได้
Shimmy Weitzhandler

3
ฉันรู้ว่านี่มันสายมากแล้ว แต่คุณไม่สามารถวางแท่นวางไว้ในกองซ้อนหรือไม่?
Kian

1
@ Kian คุณพูดถูกต้องกับความคิดเห็นของคุณฉันคิดเองพยายามและทำงานได้อย่างสมบูรณ์
Gabrielius

คำตอบ:


221

คุณสามารถทำสิ่งนี้ได้ด้วยDockPanel:

<DockPanel Width="300">
    <TextBlock>Left</TextBlock>
    <Button HorizontalAlignment="Right">Right</Button>
</DockPanel>

ความแตกต่างคือการที่StackPanelจะจัดองค์ประกอบของเด็กเป็นบรรทัดเดียว (ทั้งแนวตั้งหรือแนวนอน) ในขณะที่DockPanelกำหนดพื้นที่ที่คุณสามารถจัดเรียงองค์ประกอบของเด็กทั้งแนวนอนหรือแนวตั้งเมื่อเทียบกับแต่ละอื่น ๆ ( Dockคุณสมบัติเปลี่ยนตำแหน่งขององค์ประกอบที่เกี่ยวข้อง องค์ประกอบภายในคอนเทนเนอร์เดียวกันคุณสมบัติการจัดตำแหน่งเช่นHorizontalAlignmentเปลี่ยนตำแหน่งขององค์ประกอบที่สัมพันธ์กับองค์ประกอบหลักของมัน)

ปรับปรุง

เป็นแหลมออกในความคิดเห็นที่คุณยังสามารถใช้ทรัพย์สินของFlowDirection StackPanelดู @ D_Bester ของคำตอบ


1
นี่คือสิ่งที่ฉันหมายถึงกับ 'ฯลฯ ' ผมคิดว่าคำตอบคือไม่และจะต้องทำมันเป็นวิธีที่ยากอ่านความคิดเห็นของฉันสำหรับ JMD เหนือ
มาซิ Weitzhandler

StackPanel ไม่สามารถทำเลย์เอาต์ที่คุณต้องการได้ กริดจะให้ความยืดหยุ่นสูงสุดแก่คุณ แต่การเปลี่ยนจาก StackPanel เป็น DockPanel นั้นไม่ยากเกินไป
Dirk Vollmar

2
ไม่มี DockPanel ใน Windows 8 ไม่มีวิธีแก้ไขปัญหาใด ๆ
Christoph

@DirkVollmar จริง ๆ แล้ว StackPanel ทำงานได้ค่อนข้างดีดูคำตอบของฉัน
D_Bester

1
ถ้าคุณต้องการที่จะให้จัดรายการที่เหมาะสมที่สุดชุดLastChildFill="False"ที่เป็น<DockPanel LastChildFill="False">ดูstackoverflow.com/a/9599290/4573839
Yu Yang Jian

68

โย่สามารถตั้งค่าFlowDirectionของStack panelไปRightToLeftแล้วทุกรายการจะจัดชิดไปทางด้านขวา


3
อย่างไรก็ตามโปรดทราบว่าการเปลี่ยนแปลงนี้ (ย้อนกลับ) ลำดับของการควบคุมใน StackPanel
rumblefx0

1
@slattery หาก FlowDirection มีปัญหาให้ใส่ StackPanel ตัวอื่นและระบุ FlowDirection ดูคำตอบของฉัน
D_Bester

1
@ rumblefx0: บันทึกย่อ DockPanel จะกลับคำสั่งของตัวควบคุมหากเชื่อมต่อไปทางด้านขวาหรือด้านล่าง นี่เป็นเพราะตัวควบคุมแรกเชื่อมต่อก่อน
Olivier Jacot-Descombes

29

สำหรับผู้ที่สะดุดเมื่อคำถามนี้นี่เป็นวิธีการเพื่อให้บรรลุรูปแบบนี้กับGrid :

<Grid>
    <TextBlock Text="Server:"/>
    <TextBlock Text="http://127.0.0.1" HorizontalAlignment="Right"/>
</Grid>

สร้าง

Server:                                                                   http://127.0.0.1

18

ไม่สามารถใช้งาน DockPanel ได้อย่างที่ฉันต้องการและสลับทิศทางการไหลของ StackPanel ลำบาก การใช้กริดไม่ใช่ตัวเลือกเนื่องจากไอเท็มภายในอาจซ่อนอยู่ขณะใช้งานดังนั้นฉันไม่ทราบจำนวนคอลัมน์ทั้งหมดในขณะออกแบบ ทางออกที่ดีที่สุดและง่ายที่สุดที่ฉันสามารถทำได้คือ:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <StackPanel Grid.Column="1" Orientation="Horizontal">
        <!-- Right aligned controls go here -->
    </StackPanel>
</Grid>

สิ่งนี้จะส่งผลให้ตัวควบคุมภายในของ StackPanel ถูกจัดตำแหน่งไปทางด้านขวาของพื้นที่ว่างโดยไม่คำนึงถึงจำนวนของตัวควบคุม - ทั้งที่การออกแบบและรันไทม์ เย้! :)


ถ้า FlowDirection เป็นปัญหาให้ใส่ใน StackPanel ตัวอื่นและระบุ FlowDirection ดูคำตอบของฉัน
D_Bester

ฉันคิดว่านี่เป็นวิธีที่สะอาดกว่าการยุ่งกับทิศทางการไหลซ้อนกัน
Ross

5

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน เพียงแค่วางปุ่มก่อนเพราะคุณเริ่มจากด้านขวา หาก FlowDirection กลายเป็นปัญหาเพียงเพิ่ม StackPanel รอบ ๆ มันและระบุ FlowDirection = "LeftToRight" สำหรับส่วนนั้น หรือเพียงแค่ระบุ FlowDirection = "LeftToRight" สำหรับการควบคุมที่เกี่ยวข้อง

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" FlowDirection="RightToLeft">
    <Button Width="40" HorizontalAlignment="Right" Margin="3">Right</Button>
    <TextBlock Margin="5">Left</TextBlock>
    <StackPanel FlowDirection="LeftToRight">
        <my:DatePicker Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
    </StackPanel>
    <my:DatePicker FlowDirection="LeftToRight" Height="24" Name="DatePicker1" Width="113" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" />    
</StackPanel>

4
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Left"  />
    <Button Width="30" Grid.Column="1" >Right</Button>
</Grid>

0

สำหรับ windows 10 ให้ใช้ relativePanel แทน stack panel และใช้

relativepanel.alignrightwithpanel = "true"

สำหรับองค์ประกอบที่มีอยู่


0

หากคุณกำลังมีปัญหาเช่นเดียวกับที่ฉันมีที่ป้ายอยู่กึ่งกลางในแผงสแต็คแนวตั้งของฉันให้แน่ใจว่าคุณใช้การควบคุมความกว้างเต็ม ลบคุณสมบัติความกว้างหรือวางปุ่มของคุณในคอนเทนเนอร์เต็มความกว้างที่อนุญาตให้จัดแนวภายใน WPF เกี่ยวกับการใช้คอนเทนเนอร์เพื่อควบคุมเลย์เอาต์

<StackPanel Orientation="Vertical">
    <TextBlock>Left</TextBlock>
    <DockPanel>
        <Button HorizontalAlignment="Right">Right</Button>
    </DockPanel>
</StackPanel>

StackPanel แนวตั้งที่มีป้ายกำกับด้านซ้ายตามด้วยปุ่มขวา

ฉันหวังว่านี่จะช่วยได้.


-8

อาจไม่ใช่สิ่งที่คุณต้องการถ้าคุณต้องการหลีกเลี่ยงค่าขนาดฮาร์ดโค้ด แต่บางครั้งฉันใช้ "shim" (ตัวคั่น) สำหรับสิ่งนี้:

<Separator Width="42"></Separator>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.