如何将视图(例如标签)的高度/宽度设置为其内容的大小?

Posted

技术标签:

【中文标题】如何将视图(例如标签)的高度/宽度设置为其内容的大小?【英文标题】:How to set the height/width of a view (f.e. Label) to the size of its content? 【发布时间】:2014-08-27 15:03:10 【问题描述】:

我想将Xamarin.Forms中的View 的高度设置为其内容的大小。例如,我希望 Label 与其文本一样高。

Android 中,我可以执行layout_height="wrap_content" 之类的操作。 Xamarin.Forms 有类似的东西吗?我可以为此使用HeightRequest吗?如果可以,如何使用?

【问题讨论】:

【参考方案1】:

当您提到 View 时,这是一个非常广泛的问题,而不是像 Label 这样的具体问题,因此在不同的 View 中需要考虑一些事情strong> 场景:-

您可以使用 View 对象的 Horizo​​ntalOptionsVerticalOptions 属性来帮助解决这个问题,即 LayoutOptions.FillAndExpandLayoutOptions.CenterAndExpand

是的 - 您可以在 View 上指定 HeightRequestWidthRequest 以表明您对区域的偏好widthheightviewlayout 保留,尽管这不能保证,取决于使用的其他布局控件/视图。

如果我们专门针对 Label 控件,这不会扩大使用的特定 Label 字体大小的文本大小,以适应父 查看您指定的。为此,您必须根据需要设置 Scale 属性以将 Label 缩放到使用它的容器。

更新 1:-

使用以下示例代码,高度已经自动更改以适合显示的标签高度文本?

        StackLayout  cobjStackLayout = new StackLayout()
        
            Orientation = StackOrientation.Vertical
        ;

        Label objLabel1 = new Label();
        objLabel1.BackgroundColor = Color.Red;
        objLabel1.Text = "This is a label";
        cobjStackLayout.Children.Add(objLabel1);

        Label objLabel2 = new Label();
        objLabel2.BackgroundColor = Color.Green;
        objLabel2.Text = "This is another label with different font size";
        objLabel2.Font = Font.OfSize("Arial", 48);
        cobjStackLayout.Children.Add(objLabel2);


        this.Content = cobjStackLayout;

更新 2:- 是的 - ContentPage 的末尾有一个意想不到的垂直填充,当您只使用 一个 Label 时会发生这种情况。

如果您尝试以下操作,您应该会体验到,仅使用 1 个标签,仅围绕文本,您所追求的:-

        cobjStackLayout = new StackLayout()
        
            Orientation = StackOrientation.Horizontal,
            VerticalOptions = LayoutOptions.Start
        ;

        Label objLabel1 = new Label();
        objLabel1.BackgroundColor = Color.Red;
        objLabel1.Text = "This is a label";
        cobjStackLayout.Children.Add(objLabel1);

        this.Content = cobjStackLayout;

更新 3:-

这是一个不使用父级设置 Horizo​​ntalOptions/VerticalOptions 的版本,所以当我说在层次结构的不同部分指定的 LayoutOptions 会影响输出时,事情可能会更清楚一些:-

        cobjStackLayout = new StackLayout()
        
            Orientation = StackOrientation.Horizontal,
        ;

        Label objLabel1 = new Label();
        objLabel1.BackgroundColor = Color.Red;
        objLabel1.Text = "This is a label";
        objLabel1.HorizontalOptions = LayoutOptions.Start;
        objLabel1.VerticalOptions = LayoutOptions.Start;
        cobjStackLayout.Children.Add(objLabel1);


        this.Content = cobjStackLayout;

请记住,有时仅在您有兴趣控制的 View 上设置 Horizo​​ntalOptionsVerticalOptions 来获得所需的效果是不够的.

【讨论】:

我猜你误解了我的问题。我不想在其父视图中展开子视图。我只希望我的标签与其文本一样高,而不是更高。 我已经根据您的评论编辑了我的答案以包含一些额外的信息/代码。 尝试只使用一个Label 并将StackLayout 的方向更改为水平。你会明白我的意思。然后标签会填满整个屏幕,但我希望它只包装文本。 那(更新 2)看起来好多了,但仍然不完美。无论如何,令我困扰的是,您不能将其设置为Label,而是为此“操纵”父视图。感觉不对。 不完美?,它适合文字吗?或者尝试 Update 3,这表明它不必在 Parent 上完成。 Horizo​​ntalOptionsVerticalOptions 适用于 所有 视图。层次结构不同部分的设置会影响渲染输出。

以上是关于如何将视图(例如标签)的高度/宽度设置为其内容的大小?的主要内容,如果未能解决你的问题,请参考以下文章

将 UILabel 设置为屏幕宽度和高度以适合包含的文本

如何将每个 td 元素的高度设置为其宽度? [复制]

如何根据另一个视图的高度/宽度按比例设置视图高度/宽度?

设置根视图宽度等于动态标签的宽度

如何将 html 列宽固定为其内容的最大宽度?

如果设置锚点,如何获得视图的高度