В данном упражнении приводится несколько примеров обработки текстовых файлов и их форматирования в FlowDocument программным способом. Мне надоело описывать пошаговые инструкции, а вам надоело их разбирать, поэтому приведу итоговый код для исследования.
Что я сделал?
Здесь знак подчеркивания '_' в начале параграфа является меткой для поиска в одном из примеров.
<Window x:Class="WpfText6.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300" MinHeight="300" MinWidth="300" ResizeMode="CanResizeWithGrip" Loaded="Window_Loaded" > <TabControl> <TabItem Header="OneParagraph"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition Width="50" /> </Grid.ColumnDefinitions> <FlowDocumentScrollViewer DockPanel.Dock="Left" x:Name="flowDocumentScrollViewer" ScrollViewer.VerticalScrollBarVisibility="Visible" > <FlowDocument Name="flowDoc" TextAlignment="Left" Background="White"> <Paragraph TextAlignment="Center" FontWeight="Bold" FontSize="21"> Чтение одного параграфа </Paragraph> <Paragraph Name="text" FontFamily="Arial" /> </FlowDocument> </FlowDocumentScrollViewer> <ListBox Grid.Column="1" Name="listBox" SelectionChanged="listBox_SelectionChanged" /> </Grid> </TabItem> <TabItem Header="FullDocument"> <FlowDocument Name="fullDocument" Loaded="fullDocument_Loaded" /> </TabItem> <TabItem Header="SplitDocument"> <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"> <FlowDocument Name="splitDocument" Loaded="splitDocument_Loaded" Background="White" /> </FlowDocumentScrollViewer> </TabItem> <TabItem Header="ListDocument"> <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"> <FlowDocument Name="listDocument" Initialized="listDocument_Initialized" Background="White" /> </FlowDocumentScrollViewer> </TabItem> </TabControl> </Window>
using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; // Включаем дополнительные пространства имен using System.IO; using Microsoft.Win32; using System.Windows.Markup; using System.Collections; namespace WpfText6 { public partial class Window1 : Window { public Window1() { InitializeComponent(); } // Вынесли как поля для видимости в методах FileStream myStream; StreamReader myStreamReader; String[] arrayText; private void Window_Loaded(object sender, RoutedEventArgs e) { this.Background = Brushes.LightGray; // Можно вместо разделителя '\\' использовать '/' String fileName = "Documents/TextDocument.txt"; try { myStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); myStreamReader = new StreamReader(myStream, Encoding.GetEncoding(1251)); // Не знаем, какой массив задать, поэтому читаем в коллекцию // Но можно было и сразу в коллекцию StringBuilder.Append() ArrayList arrayList = new ArrayList(); while (myStreamReader.EndOfStream != true) arrayList.Add(myStreamReader.ReadLine());// Читаем построчно // Копируем ссылки на элементы ArrayList в массив arrayText = new String[arrayList.Count]; for (int i = 0; i < arrayList.Count; i++) arrayText[i] = (String)arrayList[i]; // Заполняем ListBox for (int i = 0; i < arrayText.Length; i++) { int pos = arrayText[i].IndexOf('.'); listBox.Items.Add(arrayText[i].Substring(0, pos + 1)); } listBox.SelectedIndex = 0; // На первый элемент списка } catch { } // Один синтаксис!!! finally { // Системные ресурсы надо закрывать myStream.Close(); myStreamReader.Close(); } } private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { text.Inlines.Clear(); // Очищаем предыдущее содержимое text.Inlines.Add(arrayText[listBox.SelectedIndex]);// Добавляем новое } private void fullDocument_Loaded(object sender, RoutedEventArgs e) { fullDocument.Background = Brushes.White;// Фон документа программно for (int i = 0; i < arrayText.Length; i++) { Paragraph para = new Paragraph(); para.FontFamily = new FontFamily("Arial"); para.Inlines.Add(arrayText[i]); fullDocument.Blocks.Add(para); } } String[] textSplit; private void splitDocument_Loaded(object sender, RoutedEventArgs e) { // Можно вместо разделителя '\\' использовать '/' String fileName = "Documents/TextDocument.txt"; try { myStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); myStreamReader = new StreamReader(myStream, Encoding.GetEncoding(1251)); String str = myStreamReader.ReadToEnd();// Читаем весь файл textSplit = str.Split('_');// Расщепляем строку по метке '_' // Элемент textSplit[0] получился пустой } catch (Exception) { } // Другой синтаксис!!! finally { // Системные ресурсы надо закрывать myStream.Close(); myStreamReader.Close(); } // Формируем заголовок программно Paragraph head = new Paragraph(); head.TextAlignment = TextAlignment.Center; Run run = new Run("Документ получен расщеплением строки"); run.FontSize = 21; Bold bold = new Bold(run); head.Inlines.Add(bold); splitDocument.Blocks.Add(head); // Заполняем FlowDocument splitDocument.FontFamily = new FontFamily("Arial"); for (int i = 1; i < textSplit.Length; i++) { Paragraph para = new Paragraph(); para.Inlines.Add(textSplit[i]); splitDocument.Blocks.Add(para); } } private void listDocument_Initialized(object sender, EventArgs e) { // Формируем заголовок Paragraph head = new Paragraph(); head.TextAlignment = TextAlignment.Center; Run run = new Run("Нумерованный список OrderList"); run.FontSize = 21; Bold bold = new Bold(run); head.Inlines.Add(bold); listDocument.Blocks.Add(head); // Создаем и настраиваем список List list = new List(); list.MarkerOffset = 25;// Отступ от маркеров list.MarkerStyle = TextMarkerStyle.Decimal; list.StartIndex = 3; // Нумерация с 3 // Заполняем список дочерними элементами list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 1")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 2")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 3")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 4")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 5")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 6")))); list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 7")))); // Присоединяем список к документу listDocument.FontFamily = new FontFamily("Arial"); listDocument.Blocks.Add(list); } } }
Результаты по примерам будут такими:
Компьютерные технологии изменяются так стремительно, что некоторым студентам самое время подумать - не пересесть ли с компьютера за штурвал комбайна или не стать ли водителем кобылы. А что, Зелинский, это мысль! Будешь давать стране угля, и дров неналомаешь. Семью обеспечишь, да еще и звезду героя соцтруда могут дать. А у нас, программистов, - одни мозоли в голове, в карманах - вши на арканах, а у преподавателей от таких "студентов" - еще и головная боль впридачу!!! Отпусти нас, Зелинский!
Один из таких комбайнеров написал про меня в Интернете - молодой писака, писательский талант прорезался, на мемуары потянуло, распирать начало. Лучше бы почитывал пока, журналюга... Спасибо, хоть слова не переврал, и то благодаря все тому же Copy-Paste. Почитайте, вам будет поучительно, может станете больше прислушиваться к тому, что я постоянно говорю "Разберитесь с кодом":
http://blogs.mail.ru/mail/vitaliy2525/31E7226B44550EB4.html#
Пописывающий сетует, что что-то делал своими собственными ручками и все работало, но лень было в этом разбираться. А через несколько лет созрел и оказалось, что это красиво - вкусно - полезно. Так причем здесь Снетков?
"Окликнешь, тихо подойдешь, попросишь сторублевку... Причем здесь нож, причем грабеж? - меняй формулировку..." Высоцкий В.С.
Зреть нужно быстрее. Научить ПРОГРАММИРОВАТЬ можно только тех, кто сам этого хочет. Кода я привожу много, на любой вкус и цвет. Разбирайтесь, экспериментируйте, спрашивайте! Но не говорите, что все так плохо и только 'приколы' хороши - это непорядочно.
Высшее профессиональное образование - это не школа благородных девиц. И я не приставленный к ней надзиратель, а свободный преподаватель. Классики, и те уже попритихли. Как научить за мизерное количество часов (и зарплату...)? Заставлять покупать учебники по тысячу рублей штука? Так ведь редко же встречаются целиком стоющие - в одних одно, в других - другое, а большей частью - один хлам.
Взгляните, например, на этот, далеко не полный, ряд 'орудий пристрастья' современного программиста: C#, C++, MFC, VCL, .NET Framework, DirectX, OpenGL, XNA, ADO.NET, SQL, MySQL, SQL Server, Access, Crystal Reports, ASP.NET, HTML, XAML, XML, Windows Forms, WPF, PHP, Ajaxs, сами оболочки C++Builder и MS Visual Studio и т.д. А ведь все это - и есть объектно-ориентированное программирование! И сколько же тысяч нужно заплатить вашим родителям, если все это покупать, чтобы держать себя в форме?
Некоторые из вас и не заметили, что уже пощупали собственными ручками то, о чем ранее даже и не слышали. Все оплачено и налито, только пей. От ' такой методики ' еще никому не поплохело! Знаю, для 'непьющих' хватило бы и Бэйсика, или программирования на листочке, или сразу зачета? Так зачем тогда пришли и на какие средства в дальнейшем собираетесь жить, позвольте спросить, когда ваши родители состарятся и уйдут?
Я не программист, я их уже много лет только готовлю (с перцем, с луком, по собственному рецепту, на приспособах домашнего производства). Есть они не только в Красноярске, можно встретить в Новосибирске, Томске, Железногорске и т.д., и даже... - в Силиконовой долине. Моя ли в том вина, что иногда попадаются подпорченные продукты (я их сам не выбираю), или те, кто сел не в свои сани?
Когда я был маленький, у меня тоже была бабушка. Это было почти вчера, но время летит так быстро: где сейчас маленький, где эта бабушка... Имейте и вы это ввиду - не минет никого чаша сия и нужно все делать вовремя, чтобы успеть состояться в жизни, а не балду гонять! Так что - тужтесь сами, да посильнее, вам 'рожать'. А я на своем месте - стою на вспоможении... (хочешь - напрягайся, буду помогать! не хочешь - дело хозяйское)