Xamarin WebView GestureRecognizer无法正常工作

问题描述 投票:0回答:1

我在Xamarin WebView上的GestureRecognizers遇到了一个尴尬的问题:尽管此处以及Xamarin论坛中的文档中有任何问题/答案都表明WebView GestureRecognizers应该都可以工作,但我无法触发任何事件。

我的XAML代码看起来像这样:

<StackLayout BackgroundColor="LightGray" >
    <WebView x:Name="webView" VerticalOptions="FillAndExpand" >
        <WebView.GestureRecognizers>
            <SwipeGestureRecognizer Direction="Left" Swiped="onSwiped"/>
        </WebView.GestureRecognizers>
        <WebView.Source>
            <HtmlWebViewSource Html="{Binding HTML}" />
        </WebView.Source>
    </WebView>
</StackLayout>

到目前为止的替代品崔德:

  • 同一页面标题上的相同GestureRecognizer:作品
  • 另一页ListView上的相同GestureRecognizer:有效
  • 尝试过的Nuget软件包Vapolia.XamarinGestures,也无法在Webview上使用
  • [试图将GestureRecoginzer放在WebView周围的StackLayout上:也不起作用。

[已在iOS设备和模拟器上尝试过。通常,iOS应该是这里最简单的部分...

我实际上想要实现的功能:向左滑动即可前进到另一个(以编程方式定义的)网页。我认为这些手势会以某种方式被webview进行常规导航,但是我想知道为什么有些示例会说所有手势都可以在webview上正常工作。

[一种替代方法是将该目标网页添加到“转发”路径上的Webview历史记录堆栈中。。但不确定如何执行此操作。

有人有提示吗?

xamarin webview uigesturerecognizer
1个回答
0
投票

您可以使用Custom Renderer在特定平台上添加滑动事件。并以表格形式处理它们。

形式

创建CustomWebView

public class CustomWebView : WebView
{
    public event EventHandler SwipeLeft;
    public event EventHandler SwipeRight;

    public void OnSwipeLeft() =>
        SwipeLeft?.Invoke(this, null);

    public void OnSwipeRight() =>
        SwipeRight?.Invoke(this, null);
}

在Android中


using Android.Content;
using Android.Views;
using App11;
using App11.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomWebView), typeof(MyWebViewRenderer))]
namespace App11.Droid
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            Control.SetOnTouchListener(new MyOnTouchListener((CustomWebView)Element));
        }

    }

    public class MyOnTouchListener : Java.Lang.Object, Android.Views.View.IOnTouchListener
    {
        float oldX;

        float newX;

        CustomWebView myWebView;
        public MyOnTouchListener(CustomWebView webView)
        {
            myWebView = webView;
        }
        public bool OnTouch(Android.Views.View v, MotionEvent e)
        {
            if (e.Action == MotionEventActions.Down)
            {
                oldX = e.GetX(0);
            }
            if (e.Action == MotionEventActions.Up)
            {
                newX = e.GetX();

                if (newX - oldX > 0)
                {
                    myWebView.OnSwipeRight();
                }
                else
                {
                    myWebView.OnSwipeLeft();
                }
            }

            return false;
        }
    }
}

在iOS中


using App11;
using App11.iOS;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using ObjCRuntime;

[assembly: ExportRenderer(typeof(CustomWebView), typeof(MyWebViewRenderer))]
namespace App11.iOS
{
    public class MyWebViewRenderer:WkWebViewRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if(e.NewElement!=null)
            {

                this.BackgroundColor = UIColor.Red;

                UISwipeGestureRecognizer leftgestureRecognizer = new UISwipeGestureRecognizer(this,new Selector("SwipeEvent:"));

                leftgestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Left;

                UISwipeGestureRecognizer rightgestureRecognizer = new UISwipeGestureRecognizer(this, new Selector("SwipeEvent:"));
                rightgestureRecognizer.Direction = UISwipeGestureRecognizerDirection.Right;

                leftgestureRecognizer.Delegate = new MyWebViewDelegate();
                rightgestureRecognizer.Delegate = new MyWebViewDelegate();

                this.AddGestureRecognizer(leftgestureRecognizer);
                this.AddGestureRecognizer(rightgestureRecognizer);
            }


        }

        [Export("SwipeEvent:")]
        void SwipeEvent(UISwipeGestureRecognizer recognizer)
        {
            var webview = Element as CustomWebView;

            if(recognizer.Direction == UISwipeGestureRecognizerDirection.Left)
            {
                webview.OnSwipeLeft();
            }
            else if(recognizer.Direction == UISwipeGestureRecognizerDirection.Right)
            {
                webview.OnSwipeRight();
            }
        }


    }

    public class MyWebViewDelegate: UIGestureRecognizerDelegate
    {
        public override bool ShouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, UIGestureRecognizer otherGestureRecognizer)
        {
            return false;
        }
    }


}

现在您只需要像]一样使用它>

<local:CustomWebView x:Name="browser"
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" 
           SwipeLeft="browser_SwipeLeft"
           SwipeRight="browser_SwipeRight">

    
© www.soinside.com 2019 - 2024. All rights reserved.