This article is currently in the process of being translated into Polish (~99% done).
The FlowDocumentPageViewer control
W poprzednim artykule omówiliśmy FlowDocumentScrollViewer, wraz z kilkoma bardziej ogólnymi technikami związanymi z FlowDocument. W tym artykule skupimy się na FlowDocumentPageViewer, który zamiast po prostu oferować przewijany tekst, gdy tekst stanie się dłuższy niż dostępne miejsce, dzieli cały dokument na strony. Dzięki temu można poruszać się ze strony na stronę, dając bardziej książkowe doświadczenie czytania.
Zaczniemy od prostego przykładu, gdzie możemy zobaczyć, jak kontrolka FlowDocumentPageViewer daje sobie radę z naszym testowym tekstem Lorem Ipsum:
<Window x:Class="WpfTutorialSamples.Rich_text_controls.FlowDocumentPageViewerSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FlowDocumentPageViewerSample" Height="300" Width="300">
<Grid>
<FlowDocumentPageViewer>
<FlowDocument>
<Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce faucibus odio arcu, luctus vestibulum tortor congue in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec lacinia neque. Donec malesuada, ligula non vestibulum cursus, urna purus pellentesque orci, aliquet accumsan dui velit ac justo. Phasellus sagittis ligula in leo dapibus, vel vestibulum felis mattis. Fusce vitae auctor nibh. Ut sit amet fringilla turpis. Aenean tincidunt feugiat sapien, quis scelerisque enim pretium commodo. Mauris fermentum posuere nulla, vitae fermentum quam malesuada in. Cras ultrices bibendum nulla eu mollis. Sed accumsan pretium magna, non sodales velit viverra id. Sed eu elit sit amet sem ullamcorper rhoncus.</Paragraph>
<Paragraph>Nulla vitae suscipit tellus. Nunc sit amet tortor fermentum, sollicitudin enim cursus, sagittis lacus. Pellentesque tincidunt massa nisl, nec tempor nulla consequat a. Proin pharetra neque vel dolor congue, at condimentum arcu varius. Sed vel luctus enim. Curabitur eleifend dui et arcu faucibus, sit amet vulputate libero suscipit. Vestibulum ultrices nisi id metus ultrices, eu ultricies ligula rutrum. Phasellus rhoncus aliquam pretium. Quisque in nunc erat. Etiam mollis turpis cursus, sagittis felis vel, dignissim risus. Ut at est nec tellus lobortis venenatis. Fusce elit mi, gravida sed tortor at, faucibus interdum felis. Phasellus porttitor dolor in nunc pellentesque, eu hendrerit nulla porta. Vestibulum cursus placerat elit. Nullam malesuada dictum venenatis. Interdum et malesuada fames ac ante ipsum primis in faucibus.</Paragraph>
</FlowDocument>
</FlowDocumentPageViewer>
</Grid>
</Window>
Zwróć uwagę, jak długi tekst jest pocięty, a na dole można poruszać się między stronami. To nie wszystko, co jednak FlowDocumentPageViewer zrobi dla Ciebie - wystarczy spojrzeć, co się dzieje, gdy zrobimy okno szerszym:
Zamiast rozciągać tekst w nieskończoność, FlowDocumentPageViewer dzieli teraz tekst na kolumny, aby zapobiec zbyt długim wierszom. Oprócz ładnego wyglądu, zwiększa to również czytelność, ponieważ teksty z bardzo długimi wierszami są trudniejsze do czytania. Liczba stron oczywiście jest automatycznie dostosowywana, dzięki czemu liczba stron zmniejszyła się z 5 do 2.
Klasa FlowDocument ma zakres właściwości, które pozwoli Ci kontrolować, jak i kiedy są one używane. Korzystanie z nich jest proste, ale pełny przykład wykracza poza zakres tego tutorialu. Zamiast tego spójrz na ten artykuł MSDN, gdzie kilka właściwości jest używanych w przykładzie: How to: Use FlowDocument Column-Separating Attributes.
Wyszukiwanie
Tak jak zaraz zobaczyć w następnym rozdziale, wrapper FlowDocumentReader obsługuje wyszukiwanie, z kontrolkami wyszukiwania na pasku narzędzi i wszystkim innym. Jednakże wszystkie trzy wrappery (tylko do odczytu) FlowDocument, które zostaną omówione w tym tutorialu, w rzeczywistości obsługuje wyszukiwanie, musi być ono tylko ręcznie wywołane w przypadku dwóch pierwszych (FlowDocumentScrollViewer i FlowDocumentPageViewer).
Wszystkie trzy wrappery obsługują skrót klawiaturowy Ctrl+F do inicjowania wyszukiwania, ale jeśli chcesz, aby było to dostępne również z poziomu np. przycisku, wystarczy wywołać metodę Find(). Oto przykład:
<Window x:Class="WpfTutorialSamples.Rich_text_controls.FlowDocumentSearchSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="FlowDocumentSearchSample" Height="300" Width="580">
<DockPanel>
<WrapPanel DockPanel.Dock="Top">
<Button Name="btnSearch" Click="btnSearch_Click">Search</Button>
</WrapPanel>
<FlowDocumentPageViewer Name="fdViewer">
<FlowDocument>
<Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce faucibus odio arcu, luctus vestibulum tortor congue in. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec lacinia neque. Donec malesuada, ligula non vestibulum cursus, urna purus pellentesque orci, aliquet accumsan dui velit ac justo. Phasellus sagittis ligula in leo dapibus, vel vestibulum felis mattis. Fusce vitae auctor nibh. Ut sit amet fringilla turpis. Aenean tincidunt feugiat sapien, quis scelerisque enim pretium commodo. Mauris fermentum posuere nulla, vitae fermentum quam malesuada in. Cras ultrices bibendum nulla eu mollis. Sed accumsan pretium magna, non sodales velit viverra id. Sed eu elit sit amet sem ullamcorper rhoncus.</Paragraph>
<Paragraph>Nulla vitae suscipit tellus. Nunc sit amet tortor fermentum, sollicitudin enim cursus, sagittis lacus. Pellentesque tincidunt massa nisl, nec tempor nulla consequat a. Proin pharetra neque vel dolor congue, at condimentum arcu varius. Sed vel luctus enim. Curabitur eleifend dui et arcu faucibus, sit amet vulputate libero suscipit. Vestibulum ultrices nisi id metus ultrices, eu ultricies ligula rutrum. Phasellus rhoncus aliquam pretium. Quisque in nunc erat. Etiam mollis turpis cursus, sagittis felis vel, dignissim risus. Ut at est nec tellus lobortis venenatis. Fusce elit mi, gravida sed tortor at, faucibus interdum felis. Phasellus porttitor dolor in nunc pellentesque, eu hendrerit nulla porta. Vestibulum cursus placerat elit. Nullam malesuada dictum venenatis. Interdum et malesuada fames ac ante ipsum primis in faucibus.</Paragraph>
</FlowDocument>
</FlowDocumentPageViewer>
</DockPanel>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.Rich_text_controls
{
public partial class FlowDocumentSearchSample : Window
{
public FlowDocumentSearchSample()
{
InitializeComponent();
}
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
fdViewer.Find();
}
}
}
Wystarczy nacisnąć nasz dedykowany przycisk Szukaj lub skrót klawiaturowy (Ctrl+F), aby uzyskać funkcję wyszukiwania w FlowDocumentPageViewer. Jak wspomniano, działa to zarówno dla FlowDocumentScrollViewer, jak i FlowDocumentPageViewer (FlowDocumentPageReader ma domyślnie przycisk wyszukiwania), ale upewnij się, że pole wyszukiwania ma wystarczająco dużo miejsca w poziomie na pasku narzędzir - w przeciwnym razie nie będzie go widać po wywołaniu polecenia Find()!