Я пишу приложение Xamarin.Forms, ориентированное на WPF и MacOS. В общем проекте Xamarin.Forms у меня есть базовый c настраиваемый элемент управления со свойствами, такими как Source
, содержащий поток, представляющий PDF-файл, который я собрал из веб-службы или файловой системы. В проектах, связанных с платформой c, у меня есть настраиваемые средства визуализации, которые отображают файл PDF в соответствии с требованиями платформы c.
Для MacOS проблема была легко решена. Однако через некоторое время я обнаружил, что инструментарий WPF не предоставляет собственный элемент управления для PDF. После некоторых исследований я решил использовать элемент управления Syncfusion PDF для WPF .
Мне не нужно что-то очень необычное, просто у меня есть возможность отображать PDF-файл на экране без панели инструментов или боковые панели, поэтому, следуя инструкциям в документации , я решил использовать PdfDocumentView
для загрузки файлов PDF.
Однако при использовании PdfViwerControl
или PdfDocumentView
I не может загружать более двух страниц за раз. Вертикальная полоса прокрутки этих элементов управления никогда не отображается, однако горизонтальная полоса прокрутки работает нормально.
Вот код, который у меня есть (загрузка локального жестко закодированного локального файла для тестирования):
Просмотр
<?xml version="1.0" encoding="UTF-8" ?>
<Grid
x:Class="MyApp.Views.DocumentOverview"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="MyApp.Controls">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
</Grid>
<Grid Grid.Row="1" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<controls:CustomPdfViewer x:Name="myPdfViewer"
BackgroundColor="Transparent"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand" />
</Grid>
</Grid>
Контроль
namespace MyApp.Controls
{
public class CustomPdfViewer : ContentView
{
//Still to implement the Stream property
}
}
Пользовательский рендерер
[assembly: ExportRenderer(typeof(CustomPdfViewer), typeof(PdfLoaderRenderer))]
namespace MyApp.WPF.CustomRenderers
{
class PdfLoaderRenderer : ViewRenderer<CustomPdfViewer, PdfDocumentView>
{
PdfDocumentView _pdfDocument = new PdfDocumentView();
protected override void OnElementChanged(ElementChangedEventArgs<CustomPdfViewer> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
SetNativeControl(_pdfDocument);
}
}
protected async override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals(nameof(Element.Source)))
{
await LoadFile();
}
base.OnElementPropertyChanged(sender, e);
}
private async Task LoadFile()
{
if (Element != null && Element.Source != null)
{
_pdfDocument.Load(@"C:\Sources\Document.pdf");
}
}
}
}
Я вижу вторую страницу, когда помещаю элемент управления в ScrollView
и устанавливаю HeightRequest
примерно на 3000 или 4000. Но несмотря ни на что, даже когда есть место для других страниц, задавая высоту, они не оказано. Я считаю, что это происходит из-за функций виртуализации элемента управления Syncfusion для повышения производительности:
Описание Syncfusion
Но, похоже, в данном случае это может повлиять на то, как я должен использовать элемент управления. Как правильно использовать Syncfusion PDF Viewer для WPF, чтобы отобразить PDF-файл с несколькими страницами на экране? Использование WebView прямо сейчас - не лучший вариант, а что касается сторонних элементов управления, у меня есть доступ только к элементам управления Syncfusion.