Xamarin表单:使用Webview显示PDF文件的问题

Xamarin表单:使用Webview显示PDF文件的问题,pdf,xamarin.forms,webview,Pdf,Xamarin.forms,Webview,我正在使用自定义渲染器在我的应用程序上显示pdf文件 下面是我的渲染器代码: 主要项目: public class PdfWebView : WebView { public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri", returnType: typeof(string), declaringType: typeo

我正在使用自定义渲染器在我的应用程序上显示pdf文件

下面是我的渲染器代码:

主要项目:

public class PdfWebView : WebView
{
    public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri",
    returnType: typeof(string),
    declaringType: typeof(PdfWebView),
    defaultValue: default(string));
    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }
}
[assembly: ExportRenderer(typeof(PdfWebView), typeof(MyWebViewRenderer))]
namespace Projectname.Droid.Renderer
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                var customWebView = Element as PdfWebView;
                Control.Settings.AllowUniversalAccessFromFileURLs = true;

                Control.Settings.JavaScriptEnabled = true;
                Control.LoadUrl(string.Format("https://drive.google.com/viewerng/viewer?url={0}", customWebView.Uri.ToString()));
            }
        }
    }
}
<local:PdfWebView 
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand"
    x:Name="pdf_Webview"/>
    
pdf_Webview.Uri = pdfurl;
Android:

public class PdfWebView : WebView
{
    public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri",
    returnType: typeof(string),
    declaringType: typeof(PdfWebView),
    defaultValue: default(string));
    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }
}
[assembly: ExportRenderer(typeof(PdfWebView), typeof(MyWebViewRenderer))]
namespace Projectname.Droid.Renderer
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                var customWebView = Element as PdfWebView;
                Control.Settings.AllowUniversalAccessFromFileURLs = true;

                Control.Settings.JavaScriptEnabled = true;
                Control.LoadUrl(string.Format("https://drive.google.com/viewerng/viewer?url={0}", customWebView.Uri.ToString()));
            }
        }
    }
}
<local:PdfWebView 
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand"
    x:Name="pdf_Webview"/>
    
pdf_Webview.Uri = pdfurl;
[程序集:ExportRenderer(typeof(PdfWebView)、typeof(MyWebViewRenderer))]
命名空间Projectname.Droid.Renderer
{
公共类MyWebViewRenderer:WebViewRenderer
{
公共MyWebViewRenderer(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
var customWebView=作为PdfWebView的元素;
Control.Settings.allowuniversalaccessfromfileurl=true;
Control.Settings.JavaScriptEnabled=true;
Control.LoadUrl(string.Format(“https://drive.google.com/viewerng/viewer?url={0},customWebView.Uri.ToString());
}
}
}
}
Xaml和Xaml.cs:

public class PdfWebView : WebView
{
    public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri",
    returnType: typeof(string),
    declaringType: typeof(PdfWebView),
    defaultValue: default(string));
    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }
}
[assembly: ExportRenderer(typeof(PdfWebView), typeof(MyWebViewRenderer))]
namespace Projectname.Droid.Renderer
{
    public class MyWebViewRenderer : WebViewRenderer
    {
        public MyWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                var customWebView = Element as PdfWebView;
                Control.Settings.AllowUniversalAccessFromFileURLs = true;

                Control.Settings.JavaScriptEnabled = true;
                Control.LoadUrl(string.Format("https://drive.google.com/viewerng/viewer?url={0}", customWebView.Uri.ToString()));
            }
        }
    }
}
<local:PdfWebView 
    HorizontalOptions="FillAndExpand"
    VerticalOptions="FillAndExpand"
    x:Name="pdf_Webview"/>
    
pdf_Webview.Uri = pdfurl;

pdf_Webview.Uri=pdfurl;
但当我在android平台上运行应用程序时,出现以下异常:

System.NullReferenceException:“对象引用未设置为对象的实例。”


ios部分没有使用渲染器,pdf在那里工作正常。android部件的实际问题是什么?

对渲染器进行了以下修改。从我自己那里得到了这个解决方案

公共类MyWebViewRenderer:WebViewRenderer
{
PdfWebView自定义网络视图;
公共MyWebViewRenderer(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
customWebView=作为PdfWebView的元素;
Control.Settings.allowuniversalaccessfromfileurl=true;
Control.Settings.JavaScriptEnabled=true;
if(customWebView.Uri!=null)
{
Control.LoadUrl(string.Format(“https://drive.google.com/viewerng/viewer?url={0},customWebView.Uri.ToString());
}
}
}
受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
if(customWebView.Uri!=null&&!Control.Url.Contains(customWebView.Uri))
{
Control.LoadUrl(string.Format(“https://drive.google.com/viewerng/viewer?url={0},customWebView.Uri.ToString());
}
}
}

哪一行引发异常?
customWebView
null吗?@Jason下面线程上的解决方案正在工作@但是PDF文件正在持续加载,请观看下面的视频。