Niektóre elementy sterujące WPF (takie jak Button
) wydają się szczęśliwie zajmować całą dostępną przestrzeń w swoim kontenerze, jeśli nie określisz wysokości, jaką ma mieć.
I niektórzy, jak ci, których muszę teraz używać, (wielowierszowy) TextBox
i ListBox
wydają się bardziej zaniepokojeni po prostu zajmowaniem miejsca niezbędnego do dopasowania ich zawartości i więcej.
Jeśli umieścisz tych facetów w komórce w UniformGrid
, rozwiną się, aby dopasować się do dostępnej przestrzeni. Jednak UniformGrid
instancje nie są odpowiednie dla wszystkich sytuacji. Co zrobić, jeśli masz siatkę z niektórymi rzędami ustawionymi na * wysokość, aby podzielić wysokość między siebie i inne * rzędy? Co jeśli masz a StackPanel
i a Label
, List
a Button
, jak możesz sprawić, by lista zajmowała całe miejsce, które nie zostało zjedzone przez etykietę i przycisk?
Myślę, że to naprawdę byłby podstawowy wymóg dotyczący układu, ale nie mogę wymyślić, jak zmusić je do wypełnienia przestrzeni, którą mogłyby (włożenie DockPanel
i ustawienie wypełnienia również nie działa, wydaje się, ponieważ DockPanel
zajmuje tylko przestrzeń potrzebną jej subcontrols).
Resizable GUI byłoby dość straszne, jeśli trzeba było grać Height
, Width
, MinHeight
, MinWidth
itd.
Czy możesz powiązać swoje Height
i Width
właściwości z zajmowaną komórką siatki? Czy jest na to inny sposób?
źródło
Odpowiedzi:
Każda kontrola pochodzące z
Panel
narzędzi odrębny układ logiczny wykonanych wMeasure()
iArrange()
:Measure()
określa rozmiar panelu i każdego z jego dzieciArrange()
określa prostokąt, w którym renderowany jest każdy formantOstatnie dziecko
DockPanel
wypełnia pozostałą przestrzeń. Możesz wyłączyć to zachowanie, ustawiającLastChild
właściwość nafalse
.StackPanel
Prosi każdego dziecka do jego żądanej wielkości, a następnie układa je. Panel stosu wywołujeMeasure()
każde dziecko, z dostępnym rozmiarem,Infinity
a następnie używa pożądanego rozmiaru dziecka.A
Grid
zajmuje całą dostępną przestrzeń, jednak ustawi każde dziecko do pożądanego rozmiaru, a następnie wyśrodkuje je w komórce.Możesz zaimplementować własną logikę układu na podstawie,
Panel
a następnie przesłonięciaMeasureOverride()
iArrangeOverride()
.Zobacz ten artykuł jako prosty przykład.
źródło
The last child of the DockPanel fills the remaining space
: to był brakujący klucz do mojego zrozumienia. Zawsze uważałem, że element bez wyraźnego Docka wypełniał przestrzeń.Istnieją również pewne właściwości, które można ustawić w celu wymuszenia zapełnienia dostępnej przestrzeni formantu, gdy inaczej by tego nie zrobił. Na przykład możesz powiedzieć:
... aby wymusić rozciągnięcie zawartości kontrolki w poziomie. Lub możesz powiedzieć:
... aby zmusić samą kontrolkę do rozciągnięcia się w poziomie, aby wypełnić jej element nadrzędny.
źródło
Cóż, sam to wymyśliłem, zaraz po opublikowaniu, co jest najbardziej zawstydzającym sposobem. :)
Wygląda na to, że każdy członek StackPanel po prostu wypełni swój minimalny wymagany rozmiar.
W DockPanel zadokowałem rzeczy w niewłaściwej kolejności. Jeśli TextBox lub ListBox jest jedynym zadokowanym elementem bez wyrównania lub jeśli są ostatnim dodanym, wypełnią pozostałe miejsce zgodnie z potrzebami.
Chciałbym zobaczyć bardziej elegancką metodę radzenia sobie z tym, ale tak się stanie.
źródło
Użyj właściwości układu HorizontalAlignment i VerticalAlignment . Kontrolują sposób, w jaki element wykorzystuje przestrzeń, którą ma w swoim obiekcie nadrzędnym, gdy dostępne jest więcej miejsca niż wymaga tego element.
Na przykład szerokość StackPanel będzie tak szeroka, jak najszerszy element, jaki zawiera. Tak więc wszystkie węższe elementy mają trochę nadmiaru miejsca. Właściwości wyrównania kontrolują to, co element podrzędny robi z dodatkową przestrzenią.
Domyślną wartością dla obu właściwości jest Rozciągnij, więc element potomny jest rozciągany, aby wypełnić całą dostępną przestrzeń. Dodatkowe opcje obejmują lewy, środkowy i prawy dla wyrównania poziomego oraz górny, środkowy i dolny dla wyrównania pionowego .
źródło