我在 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 秒。如何更快地加载它?