WPF'de kullanılabilir alanı doldurmak için kontroller nasıl alınır?


304

Bazı WPF denetimleri (gibi Button), sahip olacağı yüksekliği belirtmezseniz, kabındaki tüm kullanılabilir alanı mutlu bir şekilde tüketiyor gibi görünüyor.

Ve şu anda kullanmam gerekenler gibi bazıları, (çok satırlı) TextBoxve ListBoxsadece içeriklerine uyması için gerekli alanı alma konusunda daha endişeli görünüyor ve daha fazla değil.

Bu adamları bir hücreye bir hücrenin içine koyarsanız UniformGrid, kullanılabilir alana sığacak şekilde genişlerler. Ancak, UniformGridörnekler tüm durumlar için doğru değildir. Yüksekliği kendisi ve diğer * satırlar arasında bölmek için bazı satırları * yüksekliğine ayarlanmış bir kılavuzunuz varsa ne olur? Bir a'nız varsa StackPanelve a Label, a Listve Buttona'nız varsa, etiket ve düğme tarafından yenilmeyen tüm alanı kaplamak için listeyi nasıl alabilirsiniz?

Bunun gerçekten temel bir düzen gereksinimi olacağını düşünürdüm, ancak onları alabilecekleri alanı doldurmalarını nasıl sağlayacağımı anlayamıyorum (onları koymak DockPanelve doldurmak için ayarlamak da işe yaramaz, çünkü görünüyor. DockPanelsadece subcontrols ihtiyaç duyduğu boşluk) kaplar.

Eğer oynamak şansın varsa, yeniden boyutlandırılabilir bir GUI oldukça korkunç olurdu Height, Width, MinHeight, MinWidthvb

Kendinizin Heightve Widthözelliklerini işgal ettiğiniz ızgara hücresine bağlayabilir misiniz? Yoksa bunu yapmanın başka bir yolu var mı?


1
UniformGrid şaşırtıcı, Yeni varsayılan goto etiketim. Stackpanels basitliğini beğendim (bana bir div hatırlatıyor) ama Düzgün Izgara tam olarak ihtiyacım olanı yapar.
Terrance

Yeniden UniformGrid. Vurgu Üniforma üzerindedir. Satır yüksekliği olmayan sütun genişliklerini ayarlayamayacağınız anlaşılıyor. Yalnızca her içerik parçası aynı boyutta ise uygundur. StackPanel'imi bir Izgara ile değiştirdim ve Stretch daha sonra beklediğim gibi çalıştı.
pdschuller

Bu makale , metin kutularını genişletmeme yardımcı oldu.
jpaugh

Yanıtlar:


162

Türeyen Her kontrol Panelfarklı düzeni mantığı gerçekleştirilen uygular Measure()ve Arrange():

  • Measure() panelin ve çocuklarının her birinin boyutunu belirler
  • Arrange() her denetimin oluşturduğu dikdörtgeni belirler

Son çocuk DockPanelkalan alanı doldurur. LastChildÖzelliği ayarlayarak bu davranışı devre dışı bırakabilirsiniz false.

StackPanelİstenen boyut için her çocuk ister ve bunları dizer. Yığın paneli Measure(), kullanılabilir boyutu olan her çocuğu çağırır Infinityve sonra çocuğun istediği boyutu kullanır.

A Grid, kullanılabilir tüm alanı kaplar, ancak her çocuğu istenen boyuta ayarlayacak ve daha sonra hücrede ortalayacaktır.

Sen türetmek kendi düzeni mantığı uygulayabilirsiniz Panelve sonra ağır basan MeasureOverride()ve ArrangeOverride().

Basit bir örnek için bu makaleye bakın .


8
Bağlantı artık öldü
user3690202

6
@ user3690202 Archive.org arkadaşın. Bağlantı yeniden canlandırıldı.
ruffin

4
Konu hala MSDN'de var, ancak bağlantı şu şekilde değişti: docs.microsoft.com/en-us/dotnet/framework/wpf/controls/…
Andrea Antonangeli

2
The last child of the DockPanel fills the remaining space: bu benim anlayışımın eksik anahtarıydı. Her zaman açık Dock olmayan elemanın alanı doldurduğunu düşünüyorum.
Benekli

238

Ayrıca, bir kontrolü aksi takdirde yapmayacağı zaman kullanılabilir alanını doldurmaya zorlamak için ayarlayabileceğiniz bazı özellikler de vardır. Örneğin, şunları söyleyebilirsiniz:

HorizontalContentAlignment="Stretch"

... bir kontrolün içeriğini yatay olarak uzanmaya zorlamak için. Veya şöyle diyebilirsiniz:

HorizontalAlignment="Stretch"

... kontrolün kendisini ebeveyni doldurmak için yatay olarak germeye zorlamak için.


88
Tüm bu durumlarda belirtilen en kötü şöhretli panel StackPanel'dir. ContentAlignment özelliklerini içermez ve alt öğelerini Streç olarak ayarlamanın yıldız boyutlu bir ızgara içinde hiçbir etkisi olmaz. Çok sinir bozucu. Neredeyse StackPanel, WPF ekibinin yazdığı ilk kapsayıcıydı ve durum böyle olduğu için acı çekiyor.
Brent Schooley

4
@Brent - ahh! Stackpanel'in içeriğinin doğru bir şekilde doldurulmasına çalıştım. Teşekkürler! Bunun çok yanlış yaptığım bir şey olduğunu düşündüm.
Ashley Grenon

8
@townsean Yığın paneli çok sınırlıdır, UniformGrid kullanarak germe ve Satır veya Sütunları 0 olarak ayarlama ile benzer davranışlar elde edebilirsiniz
ForbesLindesay

2
@ Tuskan360 UniformGrid sadece hücrelerin aynı boyutta olmasına izin verir. Sonunda bir Izgara kullandım, işe yarıyor gibi görünüyor. StackPanel'in görünüşte tasarlandığı şeyi yapmadığı can sıkıcı.
TarkaDaal

4
@TarkaDaal yeh, Her şey aynı boyuttaysa UniformGrid, karmaşık göreceli boyutlar belirtmek istiyorsanız Izgara, içeriği temel alarak yalnızca boyuta göre yığını yığınlayın ve ne kadar alan olduğunu görmezden gelin.
ForbesLindesay

18

Bunu, gönderdikten hemen sonra, en utanç verici yol olduğunu kendim anladım. :)

Bir StackPanel'in her üyesinin istenen minimum boyutunu dolduracağı anlaşılıyor.

DockPanel'de işleri yanlış sırada yerleştirmiştim. TextBox veya ListBox, hizalaması olmayan tek yerleştirilmiş öğeyse veya son eklenenlerse, kalan alanı istendiği gibi dolduracaklardır.

Bunu ele almak için daha zarif bir yöntem görmek isterim, ancak olacak.


Sadece (bu eski soru üzerine!) “Hizalama olmadan” burada anahtar bir ifade olduğunu belirtmek istiyorum, en azından benim için.
MikeBaz - MSFT

4

HorizontalAlignment ve VerticalAlignment kullanın mizanpaj özelliklerini . Bir elemanın ihtiyaç duyduğundan daha fazla yer olduğunda bir elemanın ebeveyninin içindeki alanı nasıl kullandığını kontrol ederler.

Örneğin, StackPanel'in genişliği, içerdiği en geniş eleman kadar geniş olacaktır. Böylece, tüm daha dar elemanlar biraz fazla alana sahiptir. Hizalama özellikleri, alt öğenin fazladan boşlukla ne yapacağını denetler.

Her iki özellik için varsayılan değer Streçtir, bu nedenle alt öğe kullanılabilir tüm alanı dolduracak şekilde uzatılır. Ek seçenekler arasında HorizontalAlignment için Left, Center ve Right ve VerticalAlignment için Top, Center ve Bottom bulunur .


31
Bu her zaman doğruysa, asıl soru sorulmazdı. Örneğin, bir Etiket ve bir TextBox içeren yatay bir StackPanel alın. TextBox'ın sağında fazladan boşluk var. Metin Kutusu Otomatik genişliği olarak ayarlanmıştır. HorizontalAlignment için Stretch ayarı TextBox'ın kalan alanı doldurmasını sağlamaz.
Brent Schooley

Hiçbir şey her zaman doğru değildir ama bu cevap ihtiyaçlarım için işe yarıyor: DockPanel, Image.
alehro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.