Как отобразить PDF-файл на экране с помощью элементов управления Xamarin.Forms, WPF и Syncfusion? - PullRequest
0 голосов
/ 06 августа 2020

Я пишу приложение 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.

1 Ответ

0 голосов
/ 11 августа 2020

Обратитесь к следующему форуму, на котором рассматривается тот же сценарий для вашего требования, и проверьте, помогает ли эта информация решить проблему.

https://www.syncfusion.com/forums/156712/how-to-render-a-pdf-on-the-screen-using-xamarin-forms-wpf-and-syncfusion-controls

Примечание: я работаю в Syncfusion

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...