Powiedzmy, że chcę, TextBlock
aby element był Width
równy swojemu kontenerowi nadrzędnemu Width
(tj. Rozciągał się z boku na bok) lub procentem jego kontenera nadrzędnego Width
, jak mogę to osiągnąć XAML
bez podawania wartości bezwzględnych?
Chcę to zrobić, aby jeśli kontener Kontenera nadrzędnego był później rozwinięty (został Width
zwiększony), jego elementy podrzędne również zostały rozszerzone automatycznie. (w zasadzie jak w HTML i CSS)
Odpowiedzi:
Sposobem na rozciągnięcie go do tego samego rozmiaru co kontener nadrzędny jest użycie atrybutu:
Spowoduje to rozciągnięcie elementu Textbox w poziomie i wypełnienie całej przestrzeni nadrzędnej w poziomie (w rzeczywistości zależy to od używanego panelu nadrzędnego, ale powinno działać w większości przypadków).
Procentów można używać tylko z wartościami komórek siatki, więc inną opcją jest utworzenie siatki i umieszczenie pola tekstowego w jednej z komórek z odpowiednią wartością procentową.
źródło
Możesz umieścić pola tekstowe wewnątrz siatki, aby wykonać wartości procentowe w wierszach lub kolumnach siatki i pozwolić, aby pola tekstowe wypełniły się automatycznie w swoich komórkach nadrzędnych (tak jak domyślnie). Przykład:
To da # 1 2/5 szerokości, a # 2 3/5.
źródło
Zwykle użyjesz wbudowanej kontrolki układu odpowiedniej dla twojego scenariusza (np. Użyj siatki jako elementu nadrzędnego, jeśli chcesz skalować względem elementu nadrzędnego). Jeśli chcesz to zrobić z dowolnym elementem nadrzędnym, możesz utworzyć ValueConverter, ale prawdopodobnie nie będzie tak czysty, jak byś chciał. Jeśli jednak absolutnie tego potrzebujesz, możesz zrobić coś takiego:
Którego można użyć w ten sposób, aby uzyskać podrzędne pole tekstowe 10% szerokości jego nadrzędnego płótna:
źródło
CultureInfo.InvariantCulture
do podwójnej konwersji, ponieważparameter
jest traktowany jako,string
aw kulturach z różnymidecimal separator
nie będzie działać zgodnie z oczekiwaniami.Dla każdego, kto otrzymuje błąd, taki jak: ciąg „2 *” nie może zostać przekonwertowany na długość.
źródło
<RowDefinition Height="auto" />
?Można zastosować implementację IValueConverter. Klasa Converter, która dziedziczy z IValueConverter, pobiera niektóre parametry, takie jak
value
(procent) iparameter
(szerokość rodzica) i zwraca żądaną wartość szerokości. W pliku XAML szerokość składnika jest ustawiana na żądaną z wartością:XAML:
źródło
Wiem, że to nie Xaml, ale zrobiłem to samo ze zdarzeniem SizeChanged w polu tekstowym:
Pole tekstowe wydaje się mieć 80% rozmiaru swojego rodzica (prawy margines to 20%) i rozciąga się w razie potrzeby.
źródło
Używam dwóch metod określania rozmiaru względnego. Mam klasy o nazwie
Relative
z trzech dołączonych właściwościTo
,WidthPercent
aHeightPercent
co jest przydatne, jeśli chcę elementem być względna wielkość statku nigdzie elementu w drzewie wizualne i czuje się mniej hacky niż podejście kalkulator - chociaż stosowanie co działa dla ciebie, że ciebie jestem zadowolony z.Drugie podejście jest bardziej przebiegłe. Dodaj
ViewBox
gdzie chcesz mieć względne rozmiary wewnątrz, a następnie w środku dodaj aGrid
o szerokości 100. Następnie, jeśli dodasz aTextBlock
o szerokości 10 w środku, będzie to oczywiście 10% ze 100.ViewBox
Będzie skalowaćGrid
w zależności od miejsca, co zostało podane, więc jeśli jego jedyną rzeczą, na stronie, a następnieGrid
zostanie przeskalowany na pełną szerokość i skutecznie, twójTextBlock
jest skalowany do 10% strony.Jeśli nie ustawisz wysokości na
Grid
, skurczy się, aby dopasować się do jego zawartości, więc wszystko będzie miało stosunkowo duże rozmiary. Będziesz musiał upewnić się, że treść nie stanie się zbyt wysoka, tj. Zacznie zmieniać proporcje przestrzeni przydzielonej doViewBox
innej, która zacznie również skalować wysokość. Prawdopodobnie możesz obejść ten problem za pomocąStretch
ofUniformToFill
.źródło