页面中的ListView没有搞乱滚动

时间:2016-01-04 21:34:02

标签: android xamarin xamarin.android xamarin.forms

我想要实现的目标:

--- Stack Layout / Relative Layout--- 
- some widget (e.g. Label)          -
- some widget (e.g. Label)          -
- ListView                          -
-------------------------------------

但是,我还想要以下滚动行为:
顶部窗口小部件首先消失,然后ListView开始滚动。基本上,我想要一个"自然"滚动行为。

我可以实现这一目标的一种方法是将整个页面设为ListView并将小部件作为ListView的标题

但这有一个问题......我认为这是Xamarin.Forms中的一个错误:

如果你有一个很长的标签(还有什么文字?),它将不会全部显示。它实际上会使其可滚动并且一次只显示其中的一部分。更糟糕的是,你不能轻易滚动标签",你必须多次尝试使其滚动标签而不是页面,它显然会被窃听。即使页面本身已经结束(即不能再滚动),也会发生这种情况,标签仍然无法轻松滚动。

是否有另一种方式或解决方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:1)

正如其中一条评论所暗示的,最好的方法是将标签的HeightRequest设置为所需的值。 以下是我测量Android上文本高度的方法(如果你想从Xamarin.Forms调用这个函数,你需要DependencyService):

double measureString(string text, string font, double fontSize, double width)
    {
        var textView = new TextView(global::Android.App.Application.Context);
        textView.Typeface = Android.Graphics.Typeface.Create(font, Android.Graphics.TypefaceStyle.Normal);
        textView.SetText(text, TextView.BufferType.Normal);
        textView.SetTextSize(Android.Util.ComplexUnitType.Px, (float)(fontSize * Xamarin.Forms.Forms.Context.Resources.DisplayMetrics.ScaledDensity));
        int widthMeasureSpec = Android.Views.View.MeasureSpec.MakeMeasureSpec((int)(width * Xamarin.Forms.Forms.Context.Resources.DisplayMetrics.Density), width == 0 ? Android.Views.MeasureSpecMode.Unspecified : Android.Views.MeasureSpecMode.Exactly);
        int heightMeasureSpec = Android.Views.View.MeasureSpec.MakeMeasureSpec(0, Android.Views.MeasureSpecMode.Unspecified);
        textView.Measure(widthMeasureSpec, heightMeasureSpec);
        textView.SetIncludeFontPadding(false);
        return (width == 0 ? textView.MeasuredWidth : textView.MeasuredHeight) / Xamarin.Forms.Forms.Context.Resources.DisplayMetrics.Density;
    }