【问题标题】:Content of ViewCell does not scrollViewCell 的内容不滚动
【发布时间】:2019-01-30 17:55:52
【问题描述】:

在我的内容页面中,我有这样的 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 之外带有长文本的编辑器工作得很好。

我做错了吗?是否有解决方案,或者这种行为缺乏设计?

附:我想在这里使用 StackLayout,但由于本示例之外的许多原因,我必须使用带有单元格的表格。

【问题讨论】:

  • Xamarin.Forms 版本:3.4.0.1009999
  • 我认为您的 TableView(可滚动)必须拦截任何滚动事件。所以你的单元格的滚动视图永远不会收到滚动信息。我不知道你的限制是什么,但一般来说,在可滚动内容中包含可滚动内容在移动设备上并不是一个好主意。你不使用 stacklayout 的原因是什么?
  • 这只是一个设计糟糕的应用程序,它使用了应有堆栈的表格,而我无法更改它。但是上面提到的示例适用于 iOS。我认为这是 Xamarin 中的一个错误。逻辑上应该是这样的:当编辑器处于焦点时,滚动事件由编辑器处理。

标签: xamarin.forms xamarin.android


【解决方案1】:

它不滚动的原因是你的 ScrollView 在你的 TableView 中放置了一个 stacklayout

Xamarin Forms TableView 默认有滚动条,不需要手动添加

删除 ScrollView 将解决您的问题

更新

如果这不起作用,那么您可能需要进行一些自定义渲染,因为由于 tableview 需要 Android 多行编辑文本

  [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);
    }
    }
}

【讨论】:

  • 正如我在问题中提到的:“删除 ScrollView 没有帮助”。
  • 感谢更新,明天我会测试并通知您。附言我相信我一直在尝试 StackLayout 代替 ScrollView 没有成功,但明天会再试一次。
  • 好吧,没问题,我还添加了一个自定义渲染器,应该可以帮助你,只要知道你的编辑器应该足够大,可以滚动!
  • 使用 StackLayout 没有帮助。
  • 你检查自定义渲染器了吗?
【解决方案2】:

只要编辑器必须位于滚动容器中,就向 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);
        }
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2016-09-10
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多