Webview не может прокручиваться

#xamarin #webview

#xamarin #webview

Вопрос:

У меня есть эта страница Xamarin Forms:

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TestApp1"
             x:Class="TestApp1.MainPage">
<ContentPage.Content>
  <StackLayout Orientation="Vertical">
    <WebView Source="http://www.google.de" HeightRequest="3000" WidthRequest="100"/>
  </StackLayout>
</ContentPage.Content>
</ContentPage>
  

Когда я открываю свое приложение, ввожу что-либо в подсказке Google, я не могу прокручивать страницу результатов. Как мне это включить?

Когда я гуглю «xamarin webview включить прокрутку», я нахожу только информацию о его отключении…

Комментарии:

1. Считается, что запрос высоты выполняется таким образом, что WebView настолько высок, что ему не нужно прокручивать?

2. на какой платформе вы тестируете?

3. Выяснилось, что это связано со stacklayout. Если у меня нет webview в stacklayout, он прокручивается просто отлично. Но затем я спрашиваю себя, как мне выровнять любые другие элементы управления в форме, чтобы пользователь мог получить доступ к параметрам или чему-то подобному, и при этом webview по-прежнему занимал остальное пространство.

4. Я тестирую на Windows Phone 10

5. На Android это хорошо работает с макетом стека. Я могу попробовать протестировать на Windows Phone 8. У вас это работает на phone 8? Можете ли вы предоставить изображение того, чего вы пытаетесь достичь на этой странице? Кстати. настройка запросов ширины и высоты на Android, похоже, не оказывает никакого эффекта. Я думаю, вам следует использовать HorizontalOptions и VerticalOptions

Ответ №1:

Создайте свой собственный рендерер и переопределите этот метод следующим образом:

 public override bool DispatchTouchEvent(MotionEvent e)
{
    Parent.RequestDisallowInterceptTouchEvent(true);
    return base.DispatchTouchEvent(e);
}
  

Пожалуйста, найдите подробности по этой ссылке

Комментарии:

1. После обновления до Android SDK 28 и обновления Xamarin. Вместе с формами мои WebViews больше не прокручивались, но это исправлено.

Ответ №2:

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ButtonRendererDemo.WebViewPage">

  <ContentPage.Content>
    <StackLayout Orientation="Vertical" Padding="10" Spacing="10">
      <Button Text="Press me" HorizontalOptions="CenterAndExpand" VerticalOptions="Center" BackgroundColor="Green"/>        
      <WebView Source="http://www.google.de" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
    </StackLayout>
  </ContentPage.Content>    
</ContentPage>
  

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

Ответ №3:

Для меня проблема была внутри <WebView/> , я установил статические запросы HeightRequest и WidthRequest — потому что в документации говорилось, что они необходимы, если вы используете <StackLayout> — но это было неправдой

Удалив их и добавив VerticalOptions =»FillAndExpand» и HorizontalOptions =»FillAndExpand», я решил проблему для меня и позволил мне прокручивать, как ожидалось.

 <WebView VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Source="https://google.com/"/>
  

Комментарии:

1. Блестяще. Это сработало для меня при настройке Android 33.

Ответ №4:

Это работает для меня в Android очень хорошо

 [assembly: ExportRenderer(typeof(MyWebView),typeof(MyWebViewRenderer))]
namespace App.Droid.Renderers
{
    class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }
 
        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);
        }
 
        public override bool DispatchTouchEvent(MotionEvent e)
        {
            Parent.RequestDisallowInterceptTouchEvent(true);
            return base.DispatchTouchEvent(e);
        }
    }
}