Как перейти к определенному номеру страницы в программе чтения потоковых документов через код в WPF?
В считывателе flowdocument есть свойство pagenumber. Но это свойство доступно только для чтения. Есть ли способ перейти к определенному номеру страницы в считывателе flowdocument. Пожалуйста, помогите.
Благодарю.
2 ответа
Если вы хотите ограничить своих пользователей постраничным отображением, используйте вместо этого FlowDocumentPageViewer: в нем есть метод GoToPage(). По какой-то причине GoToPage(), по-видимому, не предлагается в FlowDocumentReader; Я предполагаю, что это потому, что FlowDocumentReader не всегда находится в режиме, когда подкачка имеет смысл (пользователь может выбрать представление с непрерывной прокруткой), и предоставляет свой собственный интерфейс для этого, когда это имеет смысл.
Вы можете попробовать отправить ему команду NavigationCommands.GoToPage, но это задокументировано только как работа с FlowDocumentPageViewer и DocumentViewer; Я не проверял это на FlowDocumentReader.
Если вы отслеживаете блоки в FlowDocument, содержащиеся в FlowDocumentReader, то вы можете просто использовать:
// Getting a block by index
YourReader.Document.Blocks.ElementAt(index).BringIntoView();
// Showing Last Block
YourReader.Document.Blocks.LastBlock.BringIntoView();
// Showing the last Inline
(YourReader.Document.Blocks.LastBlock as Paragraph).Inlines.LastInline.BringIntoView();
Это работает только на странице "Режимы просмотра" FlowDocumentReader.
Если вы хотите сделать это в режиме прокрутки, вы должны спуститься вниз по визуальному дереву и найти ScrollViewer, что-то вроде этого:
public static ScrollViewer FindScroll(Visual visual)
{
if (visual is ScrollViewer)
return visual as ScrollViewer;
ScrollViewer searchChiled = null;
DependencyObject chiled;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
{
chiled = VisualTreeHelper.GetChild(visual, i);
if (chiled is Visual)
searchChiled = FindScroll(chiled as Visual);
if (searchChiled != null)
return searchChiled;
}
return null;
}
ScrollViewer scroller = FindScroll(YourReader as Visual);
if (scroller != null)
(scroller as ScrollViewer).ScrollToBottom();