如何将视图(例如标签)的高度/宽度设置为其内容的大小?
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 对象的 HorizontalOptions 和 VerticalOptions 属性来帮助解决这个问题,即 LayoutOptions.FillAndExpand 或 LayoutOptions.CenterAndExpand 等
是的 - 您可以在 View 上指定 HeightRequest 和 WidthRequest 以表明您对区域的偏好width和 height 为 view 到 layout 保留,尽管这不能保证,取决于使用的其他布局控件/视图。
如果我们专门针对 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:-
这是一个不使用父级设置 HorizontalOptions/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 上设置 HorizontalOptions 或 VerticalOptions 来获得所需的效果是不够的.
【讨论】:
我猜你误解了我的问题。我不想在其父视图中展开子视图。我只希望我的标签与其文本一样高,而不是更高。 我已经根据您的评论编辑了我的答案以包含一些额外的信息/代码。 尝试只使用一个Label
并将StackLayout
的方向更改为水平。你会明白我的意思。然后标签会填满整个屏幕,但我希望它只包装文本。
那(更新 2)看起来好多了,但仍然不完美。无论如何,令我困扰的是,您不能将其设置为Label
,而是为此“操纵”父视图。感觉不对。
不完美?,它适合文字吗?或者尝试 Update 3,这表明它不必在 Parent 上完成。 HorizontalOptions 和 VerticalOptions 适用于 所有 视图。层次结构不同部分的设置会影响渲染输出。以上是关于如何将视图(例如标签)的高度/宽度设置为其内容的大小?的主要内容,如果未能解决你的问题,请参考以下文章