Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How prevent a label in a stack layout form getting cut off

I've got two labels next to each other. The first is pretty long and should get truncated if necessary. The second should be displayed completely - no matter what.

This is my code:

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,
            },
        },
    },
};

This is what I get:

My question: How can I prevent "42" from getting cut off?

Explanation of the current result: I think I know, why the second label is too small. The size of both labels is negotiated before the first text is truncated. So both labels need to shrink a bit, although the first label could handle it better.

Idea 1: I experimented with a relative layout (instead of the stack layout). However, it's a rather complicated approach and I get different results on iOS and Android. So I hope for a simpler fix.

Idea 2: Should I override one of the layouting or size negotiation methods? Maybe the "42" layout can enforce getting it's desired width.

Idea 3: Maybe we can come up with custom label renderers for iOS and Android that handle the size negotiation as expected.


Update

"42" is just an example. In my final app, this will change dynamically and can be a string of different length. So setting MinimumWidthRequest doesn't help without knowing the width of the rendered string.

like image 608
Falko Avatar asked Jan 25 '17 20:01

Falko


2 Answers

How can I prevent "42" from getting cut off?

You can set the MinimumWidthRequest in the "42" Label to prevent it from being cut off.

For details about MinimumWidthRequest please refer to remarks section of the document.

Code example:

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,
           },
       },
    },
};

Here is the result:

enter image description here

like image 117
Mike Ma Avatar answered Jan 02 '23 06:01

Mike Ma


Here you can use Grid instead of StackLayout. This will solve your 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 });
like image 45
Sharat Chandra Avatar answered Jan 02 '23 05:01

Sharat Chandra