Sejajarkan item dalam panel tumpukan?

148

Saya bertanya-tanya apakah saya dapat memiliki 2 kontrol di StackPanel yang berorientasi horisontal sehingga item yang tepat harus merapat ke sisi kanan StackPanel.

Saya mencoba yang berikut tetapi tidak berhasil:

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

Dalam cuplikan di atas, saya ingin Tombol merapat ke sisi kanan StackPanel.

Catatan: Saya perlu melakukannya dengan StackPanel, bukan Grid, dll.

Shimmy Weitzhandler
sumber
Anda secara eksplisit menyebutkan tidak ada kisi, tapi itulah tepatnya yang saya lakukan ini. Saya akan tertarik untuk melihat apakah orang lain memiliki jawaban non-grid untuk pertanyaan Anda yang sesuai dengan kebutuhan saya.
JMD
ya, saya seseorang baru saja memberi saya proyek yang penuh dengan tumpukan panel dengan cara ini, itulah yang ia inginkan untuk memperbaikinya.
Shimmy Weitzhandler
3
Saya tahu ini (sangat) terlambat, tetapi bisakah Anda tidak menaruh dockpanel di dalam stackpanel?
Kian
1
@ Kian, Anda benar dengan komentar Anda, saya memikirkannya sendiri, mencoba, dan itu bekerja dengan sempurna.
Gabrielius

Jawaban:

221

Anda dapat mencapai ini dengan DockPanel:

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

Perbedaannya adalah bahwa a StackPanelakan mengatur elemen anak menjadi satu garis (baik vertikal atau horizontal) sedangkan a DockPanelmenentukan area di mana Anda dapat mengatur elemen anak baik secara horizontal atau vertikal, relatif satu sama lain ( Dockproperti mengubah posisi elemen relatif terhadap yang lain) elemen dalam wadah yang sama. Properti perataan, seperti HorizontalAlignment, mengubah posisi elemen relatif terhadap elemen induknya).

Memperbarui

Seperti yang ditunjukkan dalam komentar Anda juga dapat menggunakan FlowDirectionproperti a StackPanel. Lihat jawaban @ D_Bester .

Dirk Vollmar
sumber
1
ini yang saya maksud dengan 'dll' Saya kira jawabannya tidak, dan harus melakukannya dengan cara yang sulit, baca komentar saya untuk JMD di atas
Shimmy Weitzhandler
Yah, StackPanel tidak bisa melakukan tata letak yang Anda inginkan. Kotak akan memberi Anda fleksibilitas terbanyak, tetapi perubahan dari StackPanel ke DockPanel tampaknya tidak terlalu sulit.
Dirk Vollmar
2
Tidak ada DockPanel di Windows 8, ada solusi lain?
Christoph
@DirkVollmar Sebenarnya StackPanel bekerja dengan sangat baik, lihat jawaban saya.
D_Bester
1
jika Anda ingin membiarkan item meluruskan paling kanan, atur LastChildFill="False"itu <DockPanel LastChildFill="False">, lihat stackoverflow.com/a/9599290/4573839
yu yang Jian
68

Yo dapat mengatur FlowDirectiondari Stack panelke RightToLeft, dan kemudian semua item akan disesuaikan ke sisi kanan.

RusBog
sumber
3
Namun perlu dicatat bahwa ini mengubah (membalikkan) urutan kontrol di StackPanel.
rumblefx0
1
@slattery Jika FlowDirection adalah masalah, masukkan saja StackPanel lain dan tentukan FlowDirection. Lihat jawaban saya.
D_Bester
1
@ rumblefx0: note, DockPanel juga membalik urutan kontrol, jika mereka merapat ke kanan atau ke bawah. Ini karena kontrol pertama, merapat terlebih dahulu.
Olivier Jacot-Descombes
29

Bagi mereka yang tersandung pada pertanyaan ini, berikut adalah cara untuk mencapai tata letak ini dengan sebuah Grid:

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

menciptakan

Server:                                                                   http://127.0.0.1
dipangkas
sumber
18

Tidak bisa menjalankan ini menggunakan DockPanel seperti yang saya inginkan dan membalikkan arah aliran StackPanel menyusahkan. Menggunakan kisi bukan merupakan pilihan karena item di dalamnya dapat disembunyikan saat runtime dan karenanya saya tidak tahu jumlah kolom pada waktu desain. Solusi terbaik dan paling sederhana yang bisa saya buat adalah:

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

Ini akan menghasilkan kontrol di dalam StackPanel yang disejajarkan ke sisi kanan ruang yang tersedia terlepas dari jumlah kontrol - baik pada desain dan runtime. Yay! :)

Ross
sumber
Jika FlowDirection merupakan masalah, masukkan saja StackPanel lain dan tentukan FlowDirection. Lihat jawaban saya.
D_Bester
Saya pikir ini adalah solusi yang jauh lebih bersih daripada mengacaukan arah aliran bersarang
Ross
5

Ini bekerja dengan baik untuk saya. Cukup taruh tombol terlebih dahulu sejak Anda mulai di sebelah kanan. Jika FlowDirection menjadi masalah, tambahkan saja StackPanel di sekitarnya dan tentukan FlowDirection = "LeftToRight" untuk bagian itu. Atau cukup tentukan FlowDirection = "LeftToRight" untuk kontrol yang relevan.

<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>
D_Bester
sumber
4
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="Left"  />
    <Button Width="30" Grid.Column="1" >Right</Button>
</Grid>
Attif
sumber
0

untuk windows 10 gunakan relativePanel, bukan stack panel, dan gunakan

relativepanel.alignrightwithpanel = "true"

untuk elemen yang terkandung.

Ahmed.Net
sumber
0

Jika Anda mengalami masalah seperti yang saya alami di mana label dipusatkan di panel tumpukan vertikal saya, pastikan Anda menggunakan kontrol lebar penuh. Hapus properti Width, atau letakkan tombol Anda di wadah lebar penuh yang memungkinkan penyelarasan internal. WPF adalah tentang menggunakan wadah untuk mengontrol tata letak.

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

StackPanel Vertikal dengan Label Kiri diikuti oleh Tombol Kanan

Saya harap ini membantu.

Christopher Zahrobsky
sumber
-8

Mungkin bukan yang Anda inginkan jika Anda perlu menghindari nilai ukuran hard-coding, tapi kadang-kadang saya menggunakan "shim" (Pemisah) untuk ini:

<Separator Width="42"></Separator>
B. Clay Shannon
sumber