Beberapa kontrol WPF (seperti Button
) tampaknya dengan senang hati menghabiskan semua ruang yang tersedia dalam wadahnya jika Anda tidak menentukan ketinggian yang harus dimiliki.
Dan beberapa, seperti yang perlu saya gunakan sekarang, (multiline) TextBox
dan yang ListBox
tampak lebih khawatir hanya mengambil ruang yang diperlukan agar sesuai dengan isinya, dan tidak lebih.
Jika Anda menempatkan orang-orang ini di sel dalam UniformGrid
, mereka akan berkembang agar sesuai dengan ruang yang tersedia. Namun, UniformGrid
contoh tidak tepat untuk semua situasi. Bagaimana jika Anda memiliki kisi dengan beberapa baris diatur ke * tinggi untuk membagi ketinggian antara dirinya dan baris * lainnya? Bagaimana jika Anda memiliki StackPanel
dan Anda memiliki Label
, List
dan Button
, bagaimana Anda bisa mendapatkan daftar untuk mengambil semua ruang yang tidak dimakan oleh label dan tombol?
Saya akan berpikir ini benar-benar akan menjadi persyaratan tata letak dasar, tapi saya tidak tahu bagaimana cara agar mereka mengisi ruang yang mereka bisa (menempatkan mereka di DockPanel
dan mengaturnya untuk mengisi juga tidak berfungsi, tampaknya, karena yang DockPanel
hanya membutuhkan ruang yang diperlukan oleh subcontrols nya).
Sebuah GUI resizable akan cukup mengerikan jika Anda harus bermain dengan Height
, Width
, MinHeight
, MinWidth
dll
Bisakah Anda mengikat Height
dan Width
properti Anda ke sel grid yang Anda tempati? Atau adakah cara lain untuk melakukan ini?
sumber
Jawaban:
Setiap kontrol yang berasal dari
Panel
mengimplementasikan logika tata letak berbeda dilakukan diMeasure()
danArrange()
:Measure()
menentukan ukuran panel dan masing-masing anak-anaknyaArrange()
menentukan persegi panjang di mana setiap kontrol direnderAnak terakhir dari
DockPanel
mengisi ruang yang tersisa. Anda dapat menonaktifkan perilaku ini dengan menyetelLastChild
properti kefalse
.Mereka
StackPanel
meminta setiap anak untuk ukuran yang diinginkan dan kemudian menumpuknya. Panel tumpukan memanggilMeasure()
setiap anak, dengan ukuran yang tersediaInfinity
dan kemudian menggunakan ukuran yang diinginkan anak tersebut.A
Grid
menempati semua ruang yang tersedia, namun, itu akan mengatur setiap anak ke ukuran yang diinginkan dan kemudian menempatkannya di dalam sel.Anda bisa menerapkan logika tata letak Anda sendiri dengan mengambil dari
Panel
dan kemudian mengesampingkanMeasureOverride()
danArrangeOverride()
.Lihat artikel ini untuk contoh sederhana.
sumber
The last child of the DockPanel fills the remaining space
: ini adalah kunci yang hilang untuk pemahaman saya. Saya selalu berpikir bahwa elemen tanpa Dock eksplisit memenuhi ruang.Ada juga beberapa properti yang bisa Anda atur untuk memaksa kontrol untuk mengisi ruang yang tersedia ketika tidak akan melakukannya. Misalnya, Anda dapat mengatakan:
... untuk memaksa konten kontrol untuk meregang secara horizontal. Atau Anda bisa mengatakan:
... untuk memaksa kontrol itu sendiri untuk meregangkan secara horizontal untuk mengisi induknya.
sumber
Yah, saya menemukan jawabannya sendiri, tepat setelah memposting, yang merupakan cara yang paling memalukan. :)
Tampaknya setiap anggota StackPanel hanya akan mengisi ukuran minimum yang diminta.
Di DockPanel, saya telah merapat hal-hal dengan urutan yang salah. Jika TextBox atau ListBox adalah satu-satunya item yang di-dock tanpa sejajar, atau jika itu adalah yang terakhir ditambahkan, mereka AKAN mengisi ruang yang tersisa seperti yang diinginkan.
Saya ingin melihat metode penanganan yang lebih elegan, tetapi itu akan berhasil.
sumber
Gunakan properti tata letak HorizontalAlignment dan VertikalAlignment . Mereka mengontrol bagaimana suatu elemen menggunakan ruang yang dimilikinya di dalam induknya ketika lebih banyak ruang tersedia daripada yang dibutuhkan oleh elemen tersebut.
Lebar StackPanel, misalnya, akan selebar elemen terluas yang dikandungnya. Jadi, semua elemen yang lebih sempit memiliki sedikit ruang berlebih. Properti pelurusan mengontrol apa yang dilakukan elemen anak dengan ruang ekstra.
Nilai default untuk kedua properti adalah Peregangan, sehingga elemen anak direntangkan untuk mengisi semua ruang yang tersedia. Opsi tambahan termasuk Kiri, Tengah dan Kanan untuk Perataan Horizontal dan Atas, Tengah dan Bawah untuk Perataan Vertikal .
sumber