Элементы управления WebView не работают / как реализовать прокрутку и касание - PullRequest
0 голосов
/ 06 августа 2020

Я использую веб-представление для отображения текста html в моем приложении. Мне нужно, чтобы пользователь мог прокручивать текст и касаться его. Однако это кажется почти невозможным. TapGesture просто не срабатывает, и, судя по моему поиску, это не ошибка с моей стороны, но кажется, что, поскольку веб-просмотр обычно используется для отображения веб-страниц, и они включают кнопки, которые не требуют жестов касания. Поэтому, если я использую свой собственный элемент управления, он работает, однако я не могу прокручивать содержимое, и если я использую прокрутку веб-просмотра, он работает по мере необходимости. Как только я реализовал настраиваемый элемент управления, я могу видеть его действие в моем выводе, однако содержимое не перемещается.

public class ExtendedWebView : WebView
    {
        public ExtendedWebView()
        {
        }

        public event EventHandler Touched;

        public void OnTouched() =>
        Touched?.Invoke(this, null);
        public ICommand PannedCommand
        {
            set { SetValue(PannedCommandProperty, value); }
            get { return (ICommand)GetValue(PannedCommandProperty); }
        }
        public static readonly BindableProperty PannedCommandProperty = BindableProperty.Create(nameof(PannedCommand), typeof(ICommand), typeof(ExtendedWebView));
    }

[assembly: ExportRenderer(typeof(ExtendedWebView), typeof(ExtendedWebViewRenderer))]
namespace AVAT.Droid.Renderers
{
    public class ExtendedWebViewRenderer : WebViewRenderer
    {
        public static int _webViewHeight;
        static ExtendedWebView _xwebView = null;
        public WebView _webView;
        bool isScroll;
        public ExtendedWebViewRenderer(Context context) : base(context)
        {
           
        }
     
        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());
            }
            _webView.Touch += (object sender, TouchEventArgs eventArgs) =>
            {

                if (eventArgs.Event.Action == Android.Views.MotionEventActions.Down)
                {
                    var webview = Element as ExtendedWebView;
             
                    webview.OnTouched();
                }
            };
            _webView.Touch += _webView_Touch;

            void _webView_Touch(object sender, TouchEventArgs e)
            {
                var webview = Element as ExtendedWebView;
                bool isMove = true;
                Console.WriteLine(e.Event.Action);
                switch (e.Event.Action)
                {
                    case Android.Views.MotionEventActions.Down:

                        isScroll = true;
                        break;
                    case Android.Views.MotionEventActions.Move:
                        isScroll = true;
                        if (isMove)
                        {
                            isMove = false;
                            webview.PannedCommand?.Execute(null);
                        }
                        break;
                    case Android.Views.MotionEventActions.Up:

                        if (!isScroll)
                        {
                            webview.OnTouched();
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    }
}

И Xaml

  <controls:ExtendedWebView
                                        x:Name="webView"
                                        Grid.ColumnSpan="1"
                                        HorizontalOptions="FillAndExpand"
                                        Source="{Binding CZ, Mode=OneWay}"
                                        Touched="webView_Touched"/>

Может быть, у вас есть опыт, как реализовать оба элемента управления коснитесь и прокрутите?

1 Ответ

0 голосов
/ 07 августа 2020

Я создаю страницу html с событием нажатия кнопки. Пожалуйста, проверьте способ, используемый для загрузки html.

html:

<!DOCTYPE html>
<html>
<head>
<style>
    .label {
        width: 800px;
        background-color: #4CAF50;
    }

    .button {
        width: 800px;
    }
</style>
</head>
<body>
<h1>Test Page</h1>
<label class="label" onclick="alert('Hello world!')">
    Click Me! This is a text label.
</label>
<button class="button" onclick="alert('Hello world!')">
   button click
</button>
</body>
</html>

Код: Код, используемый для загрузки html для веб-просмотра.

   string fileName = "XamarinDemo.webview.html";

        var assembly = typeof(XamarinDemo.MainPage).Assembly;

        Stream stream = assembly.GetManifestResourceStream(fileName);
        if (stream == null)
        {
            throw new InvalidOperationException(
                String.Format("Cannot create stream from specified URL: {0}", fileName));
        }

        StreamReader reader = new StreamReader(stream);
        string htmlString = reader.ReadToEnd();

        HtmlWebViewSource html = new HtmlWebViewSource();
        html.Html = htmlString;

        Webview_html.Source = html;

Снимок экрана:

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...