Xamarin.forms 如何在webview中实现点击手势来显示html而不是网站

Xamarin.forms 如何在webview中实现点击手势来显示html而不是网站,xamarin.forms,Xamarin.forms,我需要我的网络视图是可点击和可搜索的。一旦我实现触控,滚动就不起作用了。通过这种方式,我设法让它工作,但现在我不知道如何使网络视图可点击?按键没有任何作用,如果我使用移动,那么我只是滚动 这是我在mu droid项目中的渲染 class ExtendedWebViewClient : WebViewClient { WebView _webView; public async override void OnPageFinish

我需要我的网络视图是可点击和可搜索的。一旦我实现触控,滚动就不起作用了。通过这种方式,我设法让它工作,但现在我不知道如何使网络视图可点击?按键没有任何作用,如果我使用移动,那么我只是滚动

这是我在mu droid项目中的渲染

class ExtendedWebViewClient : WebViewClient
        {
            WebView _webView;
 
            public async override void OnPageFinished(WebView view, string url)
            {
                try
                {
                    _webView = view;
                    if (_xwebView != null)
                    {

                        view.Settings.JavaScriptEnabled = true;
                        await Task.Delay(100);
                        string result = await _xwebView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");
                        _xwebView.HeightRequest = Convert.ToDouble(result);
                    }
                    base.OnPageFinished(view, url);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"{ex.Message}");
                }
            }
            public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
            {
                return true;
            }
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            _xwebView = e.NewElement as ExtendedWebView;
            _webView = Control;

            if (e.OldElement == null)
            {
                _webView.SetWebViewClient(new ExtendedWebViewClient());
            }

            if (e.OldElement != null)
            {
                Control.Touch -= ControlOnTouch;
                Control.ScrollChange -= ControlOnScrollChange;
            }

            if (e.NewElement != null)
            {
                Control.Touch += ControlOnTouch;
                Control.ScrollChange += ControlOnScrollChange;
            }
        }

        private void ControlOnScrollChange(object sender, ScrollChangeEventArgs scrollChangeEventArgs)
        {
            if (scrollChangeEventArgs.ScrollY > 0 && scrollChangeEventArgs.OldScrollY == 0)
            {
                Control.Parent.RequestDisallowInterceptTouchEvent(true);
            }
        }

        private void ControlOnTouch(object sender, Android.Views.View.TouchEventArgs e)
        {
            // Executing this will prevent the Scrolling to be intercepted by parent views
            switch (e.Event.Action)
            {
                case MotionEventActions.Down:
                    Control.Parent.RequestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEventActions.Up:
                    Control.Parent.RequestDisallowInterceptTouchEvent(false);
                    break;
                case MotionEventActions.ButtonPress:
                    Console.WriteLine("press");
                    break;
                case MotionEventActions.Mask:
                    Console.WriteLine("mask");
                    break;
            }
            // Calling this will allow the scrolling event to be executed in the WebView
            Control.OnTouchEvent(e.Event);
        }
类扩展WebViewClient:WebViewClient
{
网络视图(WebView),;
公共异步重写void OnPageFinished(WebView视图,字符串url)
{
尝试
{
_网络视图=视图;
如果(xwebView!=null)
{
view.Settings.JavaScriptEnabled=true;
等待任务。延迟(100);
string result=wait xwebView.EvaluateJavaScriptAsync(((function(){return document.body.scrollHeight;})();
_xwebView.HeightRequest=Convert.ToDouble(结果);
}
base.OnPageFinished(视图、url);
}
捕获(例外情况除外)
{
Console.WriteLine($“{ex.Message}”);
}
}
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView视图,IWebResourceRequest请求)
{
返回true;
}
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
_xwebView=e.NewElement作为扩展webview;
_webView=控件;
if(e.OldElement==null)
{
_SetWebViewClient(新的扩展WebViewClient());
}
if(e.OldElement!=null)
{
Control.Touch-=ControlOnTouch;
Control.ScrollChange-=ControlOnScrollChange;
}
if(例如NewElement!=null)
{
Control.Touch+=ControlOnTouch;
Control.ScrollChange+=ControlOnScrollChange;
}
}
私有void控件ScrollChange(对象发送方,ScrollChangeEventArgs ScrollChangeEventArgs)
{
如果(scrollChangeEventArgs.ScrollY>0&&scrollChangeEventArgs.OldScrollY==0)
{
Control.Parent.RequestDisallowWinterCeptTouchEvent(true);
}
}
私有void ControlOnTouch(对象发送方,Android.Views.View.TouchEventArgs e)
{
//执行此操作将防止父视图截获滚动
开关(如事件、动作)
{
案例MotionEventActions.Down:
Control.Parent.RequestDisallowWinterCeptTouchEvent(true);
打破
case MotionEventActions.Up:
Control.Parent.RequestDisallowWinterCeptTouchEvent(false);
打破
case MotionEventActions.button按:
控制台。写线(“按”);
打破
case MotionEventActions.Mask:
控制台写入线(“掩码”);
打破
}
//调用此函数将允许在WebView中执行滚动事件
控制事件(如事件);
}

您可以使用以下聚焦的事件,而不是在webview上使用手势识别器。当您点击网络视图时,它将被调用

var wb = new WebView
{
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.FillAndExpand,
    Source = "xxx",
};

wb.Focused += (sender, event) =>
{
   
   //Handle your logic here!
   wb.Unfocus();
 };

Unfocus()用于在每次点击webview时实现您的逻辑。

我以前尝试过这一方法,但没有成功完成这项工作。这只是在构造器的内容页背面实现的?是的,什么方法不起作用。卷轴工作了吗?我会让邹知道我只是在执行它,我不确定,我想不是卷轴不工作,就是没有被炒鱿鱼。我最近实施了很多不同的方法,我不记得结果是什么。然而,我找不到任何关于这个焦点事件或pannedcommand的适当文档,所以我认为实现不正确!太棒了!你救了我的命!非常感谢。快乐编码:)