TabbedPage 中 ListView 中的 Xamarin Forms Slider 无法正确滑动
Xamarin Forms Slider in ListView in TabbedPage not sliding correctly
我有一个 DataTemplate,它将滑块放在 TabbedPage 的 ListView 中。在 Android 上,滑块无法正确移动,从左向右滑动会激活 TabbedPage 滑动功能。如果滑块在 ListView 之外,它可以正常工作。如何防止滑块的父控件处理拖动手势?
ViewParent.requestDisallowInterceptTouchEvent(boolean) 方法可能会有帮助,但我应该使用哪个渲染器等?
创建一个SliderRenderer
,然后在DispatchTouchEvent(MotionEvent e)
中调用RequestDisallowInterceptTouchEvent(boolean)
,就可以解决这个问题,这里是我的代码:
MainPage
:
var tabsXaml = new TabbedPage { Title = "Working with ListView" };
tabsXaml.Children.Add(new BasicListXaml { Title = "Basic", Icon = "icon.png" } );
tabsXaml.Children.Add(new JustView { Title = "JustView", Icon = "icon.png" });
tabsXaml.Children.Add(new UnevenRowsXaml { Title = "UnevenX", Icon = "icon.png" });
tabsXaml.Children.Add(new SliderPage { Title = "SliderPage", Icon = "icon.png" });
MainPage = tabsXaml;
TabbedPage
中的第二页:
<ContentPage.Content>
<local:MyListView x:Name="listView" ItemSelected="OnItemSelected">
<local:MyListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<local:MySlider HorizontalOptions="Fill"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</local:MyListView.ItemTemplate>
</local:MyListView>
</ContentPage.Content>
SlidererRenderer
:
public override bool DispatchTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Move:
//This is the core of the problem!!!
Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Up:
break;
default:
break;
}
return base.DispatchTouchEvent(e);
}
您必须调用 RequestDisallowInterceptTouchEvent(true)
方法。 Parent.Parent.Parent.Parent.Parent.Parent.Parent
在我的代码中表示Xamarin.Forms.Platform.Android.PageRenderer
,Slider
不能在中正常工作的原因是page
(在我的代码中是JustView ) 阻止滑块处理拖动手势。
我的回答基于York Shen提供的解决方案。我不喜欢父嵌套是硬编码的方式,所以我只是添加了一个函数来帮助找到我们想要调用的渲染器 RequestDisallowInterceptTouchEvent
。我的 Slider 嵌套在另一个视图中,这意味着我需要一个不同级别的父视图。所以给你:
public override bool DispatchTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
(_navigationPage ??= GetNavigationPage(Parent)).RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Move:
//This is the core of the problem!!!
_navigationPage.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Up:
break;
default:
break;
}
return base.DispatchTouchEvent(e);
}
private IViewParent _navigationPage;
private IViewParent GetNavigationPage(IViewParent parent)
{
if (parent is NavigationPageRenderer)
return parent;
return GetNavigationPage(parent.Parent);
}
我有一个 DataTemplate,它将滑块放在 TabbedPage 的 ListView 中。在 Android 上,滑块无法正确移动,从左向右滑动会激活 TabbedPage 滑动功能。如果滑块在 ListView 之外,它可以正常工作。如何防止滑块的父控件处理拖动手势?
ViewParent.requestDisallowInterceptTouchEvent(boolean) 方法可能会有帮助,但我应该使用哪个渲染器等?
创建一个SliderRenderer
,然后在DispatchTouchEvent(MotionEvent e)
中调用RequestDisallowInterceptTouchEvent(boolean)
,就可以解决这个问题,这里是我的代码:
MainPage
:
var tabsXaml = new TabbedPage { Title = "Working with ListView" };
tabsXaml.Children.Add(new BasicListXaml { Title = "Basic", Icon = "icon.png" } );
tabsXaml.Children.Add(new JustView { Title = "JustView", Icon = "icon.png" });
tabsXaml.Children.Add(new UnevenRowsXaml { Title = "UnevenX", Icon = "icon.png" });
tabsXaml.Children.Add(new SliderPage { Title = "SliderPage", Icon = "icon.png" });
MainPage = tabsXaml;
TabbedPage
中的第二页:
<ContentPage.Content>
<local:MyListView x:Name="listView" ItemSelected="OnItemSelected">
<local:MyListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<local:MySlider HorizontalOptions="Fill"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</local:MyListView.ItemTemplate>
</local:MyListView>
</ContentPage.Content>
SlidererRenderer
:
public override bool DispatchTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Move:
//This is the core of the problem!!!
Parent.Parent.Parent.Parent.Parent.Parent.Parent.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Up:
break;
default:
break;
}
return base.DispatchTouchEvent(e);
}
您必须调用 RequestDisallowInterceptTouchEvent(true)
方法。 Parent.Parent.Parent.Parent.Parent.Parent.Parent
在我的代码中表示Xamarin.Forms.Platform.Android.PageRenderer
,Slider
不能在page
(在我的代码中是JustView ) 阻止滑块处理拖动手势。
我的回答基于York Shen提供的解决方案。我不喜欢父嵌套是硬编码的方式,所以我只是添加了一个函数来帮助找到我们想要调用的渲染器 RequestDisallowInterceptTouchEvent
。我的 Slider 嵌套在另一个视图中,这意味着我需要一个不同级别的父视图。所以给你:
public override bool DispatchTouchEvent(MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
(_navigationPage ??= GetNavigationPage(Parent)).RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Move:
//This is the core of the problem!!!
_navigationPage.RequestDisallowInterceptTouchEvent(true);
break;
case MotionEventActions.Up:
break;
default:
break;
}
return base.DispatchTouchEvent(e);
}
private IViewParent _navigationPage;
private IViewParent GetNavigationPage(IViewParent parent)
{
if (parent is NavigationPageRenderer)
return parent;
return GetNavigationPage(parent.Parent);
}