ViewCell的内容不滚动

时间:2019-01-28 14:00:06

标签: xamarin.forms xamarin.android

在我的内容页面中,我有这样的XAML:

<TableView HasUnevenRows="True" Intent="Form">
    <TableRoot>
        <TableSection>
            <!-- Height is set intentionally for demo purposes -->
            <ViewCell Height="110">
                <ScrollView>
                    <Editor>
                        <Editor.Text>
1
2
3
4
5
6
7
8
9
                        </Editor.Text>
                    </Editor>
                </ScrollView>
            </ViewCell>
        </TableSection>
    </TableRoot>
</TableView>

问题是:编辑器中的文本不滚动,即我可以看到一些文本行(6 7 8 9),但是无法滚动到其他行。在iOS上运作良好。删除ScrollView没有帮助。将 HeightRequest 设置为ScrollView或Editor-没有帮助。

在Table和ViewCell之外具有长文本的编辑器完全可以正常工作。

我做错什么了吗?有解决方案,还是这种缺乏行为的设计?

P.S。我想在这里使用StackLayout,但是由于这个示例之外的许多原因,我必须使用带有单元格的表。

2 个答案:

答案 0 :(得分:1)

它不滚动的原因是因为TableView内的ScrollView放置了一个堆栈布局

Xamarin Forms TableView默认具有滚动,您无需手动添加

删除ScrollView将解决您的问题

更新

如果这不起作用,则可能需要做一些自定义渲染,因为需要使用Android多行edittext来产生表格视图

  [assembly:ExportRenderer(typeof(Editor),typeof(MyEditorRenderer))]
namespace YourNameSpace
    {
      public class MyEditorRenderer : EditorRenderer
    {
      public MyEditorRenderer(Context context) : base(context)
    {

    }

    public override bool DispatchTouchEvent(MotionEvent e)
    {
        int x = (int)e.GetX();
        int y = (int)e.GetY();
        switch (e.Action)
        {
            case MotionEventActions.Down:
                {
                    Parent.RequestDisallowInterceptTouchEvent(true);
                    break;
                }
            case MotionEventActions.Move:
                {
                    break;
                }
            case MotionEventActions.Up:
                {
                    break;
                }
            default:
                break;
        }
        return base.DispatchTouchEvent(e);
    }
    }
}

答案 1 :(得分:0)

每当必须在滚动容器中找到编辑器时,请将渲染器添加到Android项目:

using Android.Views;
using MyApp.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(Editor), typeof(ScrollForcingEditorRenderer))]
namespace MyApp.Droid.Renderers
{
    /// <summary>
    /// This class is used to force scrolling of Editor in Android
    /// when Editor is located within scrollable container.
    /// </summary>
    /// <seealso cref="EditorRenderer" />
    public class ScrollForcingEditorRenderer : EditorRenderer
    {

        public override bool DispatchTouchEvent(MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down)
            {
                // prevent sending scroll event to parent container
                Parent.RequestDisallowInterceptTouchEvent(true);
            }
            return base.DispatchTouchEvent(e);
        }
    }    
}