Eri*_*ric 8 xamarin xamarin.forms
我有一个Xamarin Forms应用程序,我想打开一个本地存储的PDF.我不需要在应用程序中加载它们,我很好地炮轰了设备的PDF默认文档查看器.我怎样才能做到这一点?
我尝试将WebView发送到PDF,但这不起作用,我只是得到一个空白页面.
我最近在自己的项目中使用自定义渲染器完成了这项工作.首先实现一个空的Xamarin表单视图,例如(我已经包含了一个可绑定的FilePath属性):
public class PdfViewer : View
{
public static readonly BindableProperty FilePathProperty =
BindableProperty.Create<DocumentViewer, string>(p => p.FilePath, null);
public string FilePath
{
get
{
return (string)this.GetValue(FilePathProperty);
}
set
{
this.SetValue(FilePathProperty, value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个将为此控件注册的iOS渲染器.此渲染器可以在iOS项目中使用Quick Look Preview Controller委托内置的iOS pdf查看器:
[assembly: ExportRenderer(typeof(PdfViewer), typeof(DocumentViewRenderer))]
public class DocumentViewRenderer
: ViewRenderer<PdfViewer, UIView>
{
private QLPreviewController controller;
protected override void OnElementChanged(ElementChangedEventArgs<DocumentViewer> e)
{
base.OnElementChanged(e);
this.controller = new QLPreviewController();
this.controller.DataSource = new DocumentQLPreviewControllerDataSource(e.NewElement.FilePath);
SetNativeControl(this.controller.View);
}
private class DocumentQLPreviewControllerDataSource : QLPreviewControllerDataSource
{
private string fileName;
public DocumentQLPreviewControllerDataSource(string fileName)
{
this.fileName = fileName;
}
public override int PreviewItemCount(QLPreviewController controller)
{
return 1;
}
public override QLPreviewItem GetPreviewItem(QLPreviewController controller, int index)
{
var documents = NSBundle.MainBundle.BundlePath;
var library = Path.Combine(documents, this.fileName);
NSUrl url = NSUrl.FromFilename(library);
return new QlItem(string.Empty, url);
}
private class QlItem : QLPreviewItem
{
public QlItem(string title, NSUrl uri)
{
this.ItemTitle = title;
this.ItemUrl = uri;
}
public override string ItemTitle { get; private set; }
public override NSUrl ItemUrl { get; private set; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
我没有编译和运行它,因为我从我的大项目中提取它,但一般来说这应该工作.
小智 6
我必须做一些事情并使用DependencyService解决它.您可以使用它来打开pdf,具体取决于每个平台
我向您展示了如何在Android上解决它的示例:
IPdfCreator.cs:
public interface IPdfCreator
{
void ShowPdfFile();
}
Run Code Online (Sandbox Code Playgroud)
MainPage.cs:
private void Button_OnClicked(object sender, EventArgs e)
{
DependencyService.Get<IPdfCreator>().ShowPdfFile();
}
Run Code Online (Sandbox Code Playgroud)
PdfCreatorAndroid.cs
[assembly: Dependency(typeof(PdfCreatorAndroid))]
namespace Example.Droid.DependecyServices
{
public class PdfCreatorAndroid : IPdfCreator
{
public void ShowPdfFile()
{
var fileLocation = "/sdcard/Template.pdf";
var file = new File(fileLocation);
if (!file.Exists())
return;
var intent = DisplayPdf(file);
Forms.Context.StartActivity(intent);
}
public Intent DisplayPdf(File file)
{
var intent = new Intent(Intent.ActionView);
var filepath = Uri.FromFile(file);
intent.SetDataAndType(filepath, "application/pdf");
intent.SetFlags(ActivityFlags.ClearTop);
return intent;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果:http: //i.stack.imgur.com/vrwzt.png
| 归档时间: |
|
| 查看次数: |
6881 次 |
| 最近记录: |