我使用Xamarin.Forms v. 2.3.4.247
创建了一个简单的测试应用程序(但问题是最新版本的Xamarin.Forms
),如下所示。
但是当我用{/ 1>这样的多行填充Editor
时
This
is
a
test.
This
is
a
test.
在我的联想平板电脑上。如果我然后点击第一条可见线,只有第一条线可见,我无法向下滚动以查看更多编辑器。
测试应用的代码
<?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
如何让用户滚动所有文字?
答案 0 :(得分:0)
如果我然后点击第一条可见线,只有第一行可见,我无法向下滚动以查看编辑器的更多内容。
您将Editor
置于ScrollView
,这就是您无法滚动Editor
的原因。在您的情况下,当您尝试滚动Editor
时,它会在系统中生成触摸事件,但Editor
和ScrollView
都希望获得此事件,以便他们可以滚动。最后我们可以从效果中看到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);
}
}
编辑: