Lenovo平板电脑上的TabbedPage编辑器未显示所有文本

时间:2017-10-06 11:20:20

标签: android xamarin xamarin.forms xamarin.android

我使用Xamarin.Forms v. 2.3.4.247创建了一个简单的测试应用程序(但问题是最新版本的Xamarin.Forms),如下所示。
但是当我用{/ 1>这样的多行填充Editor

This
is
a
test.
This
is
a
test.

在我的联想平板电脑上。如果我然后点击第一条可见线,只有第一条线可见,我无法向下滚动以查看更多编辑器。

此图片显示了一个示例 Example of the Editor, when text is focused

Example of the Editor without focus

测试应用的代码

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
      xmlns:local="clr-namespace:TestApp"
      x:Class="TestApp.MainPage">

   <ContentPage Title="Test">
      <Grid ColumnSpacing="0" RowSpacing="0">
         <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
         </Grid.RowDefinitions>
         <Label Text="Title" Grid.Row="0" />
         <ScrollView Grid.Row="1">
            <StackLayout Padding="10,0,10,10" Orientation="Vertical">
               <Label Text="Test" />
               <Button Text="Choose a project" />
               <Label Text="Project description" />
               <Label Text="Date" />
               <DatePicker />
               <Label Text="Employee" />
               <Picker>
                  <Picker.Items>
                     Test
                  </Picker.Items>
               </Picker>
               <Label Text="Payment-type" />
               <Picker />
               <Label Text="Amount" />
               <Entry />
               <Entry />
               <Label Text="Description" />
               <Editor MinimumHeightRequest="150" HeightRequest="150"  VerticalOptions="FillAndExpand" />
               <Button />
            </StackLayout>
         </ScrollView>
      </Grid>
   </ContentPage>
</TabbedPage>

我只附加了xaml代码,因为C#代码只有InitializeComponent

如何让用户滚动所有文字?

1 个答案:

答案 0 :(得分:0)

  

如果我然后点击第一条可见线,只有第一行可见,我无法向下滚动以查看编辑器的更多内容。

您将Editor置于ScrollView ,这就是您无法滚动Editor的原因。在您的情况下,当您尝试滚动Editor时,它会在系统中生成触摸事件,但EditorScrollView都希望获得此事件,以便他们可以滚动。最后我们可以从效果中看到ScrollView拦截此触摸事件,因此您的Editor无法接收此触摸事件。因此,ScrollView可以滚动,但您的Editor不能滚动。

您可以使用Custom Renderers来处理本机平台中的此事件冲突。例如,在Android中,您可以使用RequestDisallowInterceptTouchEvent告诉ScrollView不要拦截此触摸事件:

  

当孩子不希望这个父母及其祖先用onInterceptTouchEvent(MotionEvent)拦截触摸事件时调用。

     

此父级应将此调用传递给其父级。此父母必须在触摸持续时间内服从此请求(即,只有在此父母收到警告或取消后才清除该标志。

这是我的代码,它在我身边运作良好:

将您的Editor更改为:

<local:MyEditor MinimumHeightRequest="150" HeightRequest="150" />

MyEditor

public class MyEditor : Editor
{
}
MyEditorRenderer

Android

public class MyEditorRenderer : EditorRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
    {
        base.OnElementChanged(e);
    }

    public override bool DispatchTouchEvent(MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                //Parent.Parent.Parent ==> ScrollViewRenderer
                Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
                //need to handle this touch event
                break;
            case MotionEventActions.Move:
                //Parent.Parent.Parent ==> ScrollViewRenderer
                Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
                break;
            case MotionEventActions.Up:
                break;
            default:
                break;
        }
        return base.DispatchTouchEvent(e);
    }
}

编辑:

enter image description here