Пользовательский Xamarin.Forms.WebView для чтения PDF.Прокрутка с якорем - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь найти способ отображения локальных файлов PDF на xamarin.forms.Я нашел решение с реализацией пользовательской реализации webview и его рендеринга: pdf reader

Основной код:

public class CustomWebView : WebView
{
    public static readonly BindableProperty UriProperty = BindableProperty.Create<CustomWebView, string>(p => p.Uri, default(string));

    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }
}

Визуализация:

[assembly: ExportRenderer (typeof(CustomWebView), typeof(CustomWebViewRenderer))]
namespace DisplayPDF.iOS
{
    public class CustomWebViewRenderer : ViewRenderer<CustomWebView, UIWebView>
    {
        protected override void OnElementChanged (ElementChangedEventArgs<CustomWebView> e)
        {
            base.OnElementChanged (e);

            if (Control == null) {
                SetNativeControl (new UIWebView ());
            }
            if (e.OldElement != null) {
                // Cleanup
            }
            if (e.NewElement != null) {
                var customWebView = Element as CustomWebView;
                string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", WebUtility.UrlEncode (customWebView.Uri)));
                Control.LoadRequest (new NSUrlRequest (new NSUrl (fileName, false)));
                Control.ScalesPageToFit = true;
            }
        }
    }
}

И моя страница:

public class WebViewPageCS : ContentPage
    {
        public WebViewPageCS ()
        {
            webView = new CustomWebView
            {
                Uri = "ScalaReference.pdf",
                HorizontalOptions = LayoutOptions.FillAndExpand,
                VerticalOptions = LayoutOptions.FillAndExpand
            };
    }

Но сейчас я не могу найти способ добавить привязку к этому файлу PDF, как описано в этом посте: привязку к PDF

Также я попытался использовать этот код для оценки сценария:

private async void Scroll_Clicked(object sender, EventArgs e)
{
      webView.Eval($"window.scrollTo(0, {x});");
}

он отлично работает с веб-просмотром по умолчанию, но не с пользовательским.

Возможно, кто-то знает какой-либо другой способ прокрутки /установить привязку к pdf и ссылку на эту привязку через xamarin.forms?Спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

работает нормально с веб-просмотром по умолчанию, но не с пользовательским.

Это не вызвано пользовательским веб-просмотром, поскольку средство визуализации создает новый UIWebview для Control в CustomWebViewRendererпосмотрите на эту часть кода:

if (Control == null) {
   SetNativeControl (new UIWebView ());
}

Итак, он не работает при выполнении webView.Eval($"window.scrollTo(0, {x});");, поскольку это веб-представление на самом деле не является UIWebview.

Решение

Создайте BindableProperty в CustomWebView

public static readonly BindableProperty AnchorProperty = BindableProperty.Create<CustomWebView, float>(p => p.Anchor, default(float));

public float Anchor
{
    get { return (float)GetValue(AnchorProperty); }
    set { SetValue(AnchorProperty, value); }
}

Запустите его на странице

private void Scroll_Clicked(object sender, System.EventArgs e)
{
    webview.Anchor = 200;
}

Получите значение в устройстве визуализации и выполните прокрутку веб-просмотра.

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    base.OnElementPropertyChanged(sender, e);

    if(e.PropertyName is "Anchor")
    {
        var customWebView = Element as CustomWebView;
        float anchor = customWebView.Anchor;
        Control.ScrollView.ContentOffset = new CoreGraphics.CGPoint(0, anchor);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...