Xamarin Forms(Android)中的垂直和水平滚动问题

时间:2014-12-12 07:38:48

标签: xamarin xamarin.forms

我是Xamarin的新手。我正在尝试用Xamarin表单创建一个带有5个自定义horizo​​ntallistview的样本(我已经使用渲染器在不同的平台上实现相同。当我在屏幕上只有2个这样的控件时,它可以完美地工作(水平滚动)。当我添加所有5我必须在垂直方向的ScrollView中添加这些控件,以便我可以看到所有控件。当我这样做时,我只能垂直滚动页面。我无法水平滚动单个控件(水平线视图)。 / p>

此问题仅适用于Android。它在Windows Phone中运行良好。

以下是我的代码:

    <ScrollView Orientation="Vertical">
       <StackLayout Padding="5, 25" Orientation="Vertical" VerticalOptions="FillAndExpand">
          <Image Source ="label_entertainment.png" HorizontalOptions="Start"/>
          <local:HorizontalListViewEntertainment x:Name="entertainmentView" Items="{Binding Entertainment}" HeightRequest="198"/>
          <Image Source ="label_music.png" HorizontalOptions="Start"/>
          <local:HorizontalListViewMusic x:Name="musicListView" Items="{Binding Music}" HeightRequest="198"/>
          <Image Source ="label_movies.png" HorizontalOptions="Start"/>
          <local:HorizontalListViewMovies x:Name="movieListView" Items="{Binding Movies}" HeightRequest="198"/>
          <Image Source ="label_celebrities.png" HorizontalOptions="Start"/>
          <local:HorizontalListViewCelebrities x:Name="celebritiesListView" Items="{Binding Celebrities}" HeightRequest="198"/>
          <Image Source ="label_style.png" HorizontalOptions="Start"/>
          <local:HorizontalListViewStyle x:Name="styleListView" Items="{Binding Celebrities}" HeightRequest="198"/>
      </StackLayout>
  </ScrollView>

我找到了解决方案here。然而,在我的情况下它并不起作用,因为我没有内部滚动视图。请帮忙。谢谢!

2 个答案:

答案 0 :(得分:4)

我找到了解决方案。我只需要将以下代码添加到android中的horizo​​ntallistviews的CustomRenderer中。

public override bool DispatchTouchEvent(MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                StartX = e.RawX;
                StartY = e.RawY;
                this.Parent.RequestDisallowInterceptTouchEvent(true);
                break;
            case MotionEventActions.Move:
                if (IsHorizontal * Math.Abs(StartX - e.RawX) < IsHorizontal * Math.Abs(StartY - e.RawY))
                    this.Parent.RequestDisallowInterceptTouchEvent(false);
                break;
            case MotionEventActions.Up:
                this.Parent.RequestDisallowInterceptTouchEvent(false);
                break;
        }
        return base.DispatchTouchEvent(e);
    }

提到this

答案 1 :(得分:0)

您是否尝试过使用ScrollView和Horizo​​ntalScrollView? http://android-code-crumbs.blogspot.ro/2011/06/how-to-set-horizontal-and-vertical.html