2017-01-25 41 views
5

Mam dwie etykiety obok siebie. Pierwsza jest dość długa iw razie potrzeby powinna zostać obcięta. Drugi powinien być wyświetlany całkowicie - bez względu na wszystko.W jaki sposób zapobiec odcięciu etykiety w formularzu układu stosu

To jest mój kod:

MainPage = new ContentPage { 
    Content = new StackLayout { 
     Orientation = StackOrientation.Horizontal, 
     VerticalOptions = LayoutOptions.CenterAndExpand, 
     BackgroundColor = Color.Orange, 
     Padding = 10, 
     Children = { 
      new Label { 
       Text = "The answer to life the universe and everything", 
       HorizontalOptions = LayoutOptions.Start, 
       LineBreakMode = LineBreakMode.TailTruncation, 
       BackgroundColor = Color.Yellow, 
      }, 
      new Label { 
       Text = "42", 
       HorizontalOptions = LayoutOptions.EndAndExpand, 
       LineBreakMode = LineBreakMode.NoWrap, 
       BackgroundColor = Color.Yellow, 
      }, 
     }, 
    }, 
}; 

To co mam:

Moje pytanie: W jaki sposób można zapobiec "42" z coraz cięcie poza?

Wyjaśnienie bieżącego wyniku: Myślę, że wiem, dlaczego druga etykieta jest za mała. Rozmiar obu etykiet jest negocjowany przed pierwszy tekst jest obcięty. Tak więc obie etykiety muszą się trochę skurczyć, chociaż pierwsza etykieta mogłaby lepiej sobie z tym poradzić.

Idea 1: Eksperymentowałem z układem względnym (zamiast układu stosu). Jest to jednak dość skomplikowane podejście i uzyskuję różne wyniki w systemach iOS i Android. Mam nadzieję na prostszą naprawę.

Idea 2: Czy należy zastąpić jedną z metod negocjacji układu lub rozmiaru? Może układ "42" może wymusić uzyskanie pożądanej szerokości.

Idea 3: Może uda nam się wymyślić niestandardowe rendery dla systemów iOS i Android, które obsługują negocjację rozmiaru zgodnie z oczekiwaniami.


Aktualizacja

"42" jest tylko przykładem. W mojej ostatniej aplikacji zmieni się to dynamicznie i może być ciągiem o różnej długości. Ustawienie MinimumWidthRequest nie pomoże bez znajomości szerokości renderowanego łańcucha.

Odpowiedz

5

Jak zapobiec odcięciu "42"?

Można ustawić MinimumWidthRequest w „42” Label aby zapobiec jej odciąć.

Aby uzyskać szczegółowe informacje na temat MinimumWidthRequest, należy zapoznać się z uwagami w sekcji document.

przykładem Kod:

MainPage = new ContentPage { 
    Content = new StackLayout { 
     Orientation = StackOrientation.Horizontal, 
     VerticalOptions = LayoutOptions.CenterAndExpand, 
     BackgroundColor = Color.Orange, 
     Padding = 10, 
     Children = { 
      new Label { 
       Text = "The answer to life the universe and everything The answer to life the universe and everything", 
       HorizontalOptions = LayoutOptions.Start, 
       LineBreakMode = LineBreakMode.TailTruncation, 
       BackgroundColor = Color.Yellow, 
      }, 
      new Label { 
       MinimumWidthRequest = 50, 
       Text = "42", 
       HorizontalOptions = LayoutOptions.EndAndExpand, 
       LineBreakMode = LineBreakMode.NoWrap, 
       BackgroundColor = Color.Yellow, 
      }, 
     }, 
    }, 
}; 

Oto wynik:

enter image description here

+0

Dzięki, Mike! Jestem jednak świadomy właściwości 'MinimumWidthRequest'. Przepraszam, że nie wyjaśniłem tego w moim pytaniu, ale "42" to bardzo prosty przykład i będzie to wartość dynamiczna o różnej długości w mojej aplikacji. Odpowiednio zaktualizuję moje pytanie. – Falko

+1

@Falko po prostu utrzymuj 'MinimumWidthRequest' większy niż twój rozmiar szerokości etykiety, ustawiając' MinimumWidthRequest' wystarczająco duży jak 500.Orient klienta ustaw 'MinimumWidthRequest' większy niż twój rozmiar szerokości etykiety Nie znam ios. Ale po stronie Androida możesz uzyskać rozmiar w funkcji 'OnMeasure'. Myślę, że ios powinien być podobny. –

+3

WOW! To. Jest. Właśnie. Niesamowite! I jest całkowicie sprzeczne z intuicją, że * minimalna * prośba o szerokość arbitralnie dużej liczby skaluje etykietę w sam raz. Żółte pole nie jest nawet większe niż tekst "42", jeśli lewy tekst jest krótszy i nie jest przycięty. Myślałem, że twoja wartość 50 jest dostrojona do tego przykładu. Ale po prostu użyję dużej stałej takiej jak 1000 lub 1e6 i doskonale działa na Androida i iOS. – Falko

0

Tutaj można używać Grid zamiast StackLayout. To rozwiąże twój problem.

Grid:

var grid = new Grid(); 
grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); 
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); 
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); 
+0

Dzięki za odpowiedź. Zastąpienie StackLayout siatką jest jednak dość skomplikowane i - w zależności od architektury aplikacji, która nie jest łatwa do wykonania. Jest podobny do mojego pomysłu 1 i prawdopodobnie wprowadzi nowe trudności. – Falko