Я использую веб-представление для отображения текста 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"/>
Может быть, у вас есть опыт, как реализовать оба элемента управления коснитесь и прокрутите?