1

いくつかの本のページを含む sqlite データベースにテーブルがあります。各本には約 300 ~ 400 ページが含まれます。データベースの各レコードには、flowDocument 形式のページ コンテンツのフィールドがあります。

今、各本をdocumentRaader(Adobe pdfリーダーなど)にロードしたいのですが、ページ数が多いため、非常に遅くなります。

これは私のコードです:

public void LoadBook()
{
    FlowDocumentReader ViewContent = new FlowDocumentReader()
    FixedDocument fd = new FixedDocument();
    ViewContent.Document = fd;

    DataTable dt = libraryclass.GetBookPages();
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        string pagecontent = ReplaceText(dt.Rows[i]["Content"].ToString());

        FlowDocument flow = ContentView.ConvertForView(pagecontent);

        flow.TextAlignment = TextAlignment.Justify;
        flow.FontSize = 18;
        PageContent page = new PageContent();

        RichTextBox rich = new RichTextBox();
        //rich.LineDown();
        rich.IsReadOnly = true;
        rich.Document = flow;
        rich.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;

        rich.Margin = new Thickness(20, 70, 20, 70);
        //rich.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
        rich.Width = 710;
        rich.BorderBrush = null;
        rich.BorderThickness = new Thickness(0);
        rich.Height = 840;

        fd.Pages.Add(page);
        page.Child = new FixedPage();
        page.Child.Width = 750;
        page.Child.Height = 970;

        page.Child.Children.Add(rich);
    }
}

毎回現在表示されている本のページと、次/前のページのみを読み込むことはできますか?

WPF に Android ViewPager のようなコントロールはありますか?

前もって感謝します。

編集 :

コードを変更し、次のコードで xpsDocument を使用しています。

private void LoadBook()
{
    DataTable dt = db.Select("Select Content From PageTBl where BookID = 3");
    FlowDocument flow = new FlowDocument();
    foreach (DataRow row in dt.Rows)
    {
        String content = row["Content"].ToString();
        content = String.IsNullOrEmpty(content.Trim()) ? "<FlowDocument xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Name=\"flowducument21\"><Section/></FlowDocument>" : content;
        FlowDocument fd = XamlReader.Load(new MemoryStream(Encoding.GetEncoding("utf-8").GetBytes(content))) as FlowDocument;
        flow.Blocks.Add(fd.Blocks.FirstBlock);   
    }

    DocumentPaginator dpaginator = new CustomDocumentPaginator(((IDocumentPaginatorSource)flow).DocumentPaginator, new Size(793.5987, 1122.3987), new Size(96, 96), "");

    MemoryStream stream = new MemoryStream();

    Package package = Package.Open(stream, FileMode.Create, FileAccess.ReadWrite);

    var uri = new Uri(@"memorystream://myXps.xps");

    PackageStore.AddPackage(uri, package);
    var xpsDoc = new XpsDocument(package);
    xpsDoc.Uri = uri;
    XpsDocument.CreateXpsDocumentWriter(xpsDoc).Write(dpaginator);
    FixedDocumentSequence fds = xpsDoc.GetFixedDocumentSequence();

    DViewer.Document = fds;
}

ただし、ロードには約140秒かかります。より速くロードするには?

4

0 に答える 0