Xamarin Forms中TabbedPage中ListView中的Slider滑动不正确

4
我有一个DataTemplate,它将一个滑块放在TabbedPage中的ListView中。在Android上,滑块不能正确移动,从左到右滑动会激活TabbedPage的滑动功能。如果滑块在ListView之外,它可以正常工作。如何防止父控件处理拖动手势?
方法ViewParent.requestDisallowInterceptTouchEvent(boolean)可能有所帮助,但我应该在哪个渲染器等方面进行操作? 问题的视频
2个回答

2
创建一个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;
< p >在 < code >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。在 video 中,Slider 无法正常工作的原因是 page(在我的代码中是 JustView)阻止了滑块处理拖动手势。

enter image description here


太棒了!你救了我一命,谢谢! - Co-der

1
我基于York Shen提供的解决方案回答。我不喜欢硬编码的父级嵌套方式,因此我只是添加了一个函数来帮助找到我们想要调用RequestDisallowInterceptTouchEvent的渲染器。我的滑块被嵌套在另一个视图中,这意味着我需要不同级别的父级。所以这里是:
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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接