いくつかの本のページを含む 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秒かかります。より速くロードするには?