пражнение 6. Выборка текста из текстового файла с форматированием на лету

В данном упражнении приводится несколько примеров обработки текстовых файлов и их форматирования в FlowDocument программным способом.

В итоговом коде сделано:

  1. Добавил к решению новый проект типа WPF Application с именем WPFText6
  2. Создал в корне проекта каталог Documents и добавил в него готовый текстовый файл TextDocument.txt с таким случайным содержимым (приводится в каталоге Source )
    1. Критерием отнесения ТС к маршрутным является наличие установленного маршрута с обозначенными местами остановок. К таковым Правила относят автобусы, троллейбусы и трамваи (п. 1.2). Автомобили-такси к маршрутным ТС не относятся.
    2. Знак 4.1.4 "Движение прямо или направо" разрешает вам движение только прямо или поворот на АЗС, расположенную справа от дороги, т.е. в направлениях А или Б.
    3. Знак 5.7.1 "Выезд на дорогу с односторонним движением" информирует о направлении движения, установленном на пересекаемой дороге. Кроме поворота направо на этом перекрестке возможны движение прямо и разворот. При движении в любом из этих направлений вы должны уступить дорогу (знак 2.4 "Уступите дорогу") ТС, движущимся по пересекаемой дороге.
    4. Знак 5.29 "Зона регулируемой стоянки" относится к так называемым зональным знакам, требования которых действуют на всей территории (участке дороги), обозначенной такими знаками, вплоть до выезда из зоны, обозначенного в данном случае знаком 5.30 "Конец зоны регулируемой стоянки". Действие знаков не прерывается на перекрестках. При этом информацию о видах ТС, способах парковки и т.д. размещают на табличке под знаком или с помощью изображения таблички в нижней части знака. В данном случае табличка 8.6.2 "Способ постановки транспортного средства на стоянку" разрешает ставить легковые автомобили на стоянку с использованием тротуара на территории всей зоны регулируемой стоянки, т.е. на любой стороне дорог, расположенных в зоне регулируемой стоянки (Приложение 1).
    5. Разметка 1.19 (в виде стрел) предупреждает вас о необходимости покинуть полосу движения в связи с уменьшением количества полос в данном направлении (сужением проезжей части). Необходимо перестроиться на правую полосу.
    6. Для информирования водителей о предстоящей смене зеленого сигнала светофора на желтый Правилами предусмотрена возможность мигания зеленого сигнала. Этот сигнал разрешает движение ТС (п. 6.2). Длительность мигания при этом должна составлять 3 сек.
    7. Водитель обязан подавать сигналы световыми указателями поворота соответствующего направления перед началом движения, перестроением, поворотом, остановкой (п. 8.1). Двигаясь по закруглению дороги и не намереваясь перестраиваться или останавливаться, вы не должны включать указатели поворота, что бы не вводить в заблуждение других участников движения (п. 8.2).
    8. При взаимном перестроении водитель легкового автомобиля должен уступить дорогу водителю мотоцикла, находящемуся от него справа (п. 8.4).
    9. Выполняя разворот на этом перекрестке, вам придется использовать для движения участок проезжей части, имеющий двустороннее движение. Поэтому, въезжая на перекресток, вы можете продолжить движение только по правой стороне этого участка проезжей части (п. 1.4), т.е. по траектории А.
    10. Знак 4.6 "Ограничение минимальной скорости" и табличка 8.14 "Полоса движения" предписывают двигаться по левой полосе со скоростью не менее 50 км/ч. Однако при этом на дороге вне населенного пункта, не относящейся к автомагистрали, вы не имеете права развивать скорость на легковом автомобиле более 90 км/ч (п. 10.3).
    11. На нерегулируемых перекрестках обгон запрещен при движении по дороге, не являющейся главной (п. 11.5). Поскольку водитель легкового автомобиля приближается к перекрестку неравнозначных дорог, двигаясь по главной дороге (знак 2.3.1 "Пересечение с второстепенной дорогой"), то он может совершить обгон обоих грузовых автомобилей, так как дорога имеет две полосы для движения в данном направлении (п. 11.4). Следовательно, обгон может быть совершен по траекториям А и Б.
    12. Остановившись за пешеходным переходом в 5 м от края пересекаемой проезжей части и обеспечив при этом расстояние в 3 м до сплошной линии разметки, водитель не нарушил правила стоянки (пп. 12.4 и 12.5).
    13. При движении в направлении стрелки, включенной в дополнительной секции одновременно с красным сигналом светофора, вы обязаны уступать дорогу ТС, движущимся с других направлений (п. 13.5).
    14. Несмотря на то что легковой автомобиль первым въехал на перекресток равнозначных дорог, вы имеете перед ним преимущество, и его водитель при левом повороте должен уступить вам дорогу (пп. 13.11 и 13.12).
    15. Проезжая данный перекресток неравнозначных дорог по направлению главной дороги (знаки 2.1 "Главная дорога" и 8.13 "Направление главной дороги"), вы никому не должны уступать дорогу, так как пользуетесь преимуществом как перед находящимся на главной дороге автобусом, для которого вы являетесь "помехой справа" (пп. 13.10 и 13.11), так и перед легковым автомобилем, движущимся по второстепенной дороге (п. 13.9).
    16. Знак 5.21 "Жилая зона" показывает, что вы въезжаете на территорию, где скорость не должна превышать 20 км/ч (п. 10.2).
    17. При движении в темное время суток на неосвещенных участках дорог вы должны использовать, в зависимости от дорожных условий, скорости движения и наличия впереди встречных и попутных ТС, ближний или дальний свет фар (п. 19.1).
    18. Из всех перечисленных неисправностей только неработающий стеклоподъемник не является причиной запрещения эксплуатации вашего ТС. Остальные неисправности включены в Перечень (п. 7.4), и при их наличии эксплуатация ТС запрещена.
    19. При съезде автомобиля правыми колесами на неукрепленную и влажную обочину возникает опасность заноса из-за разницы сцепления правых и левых колес с дорогой. При этом целесообразно, не меняя скорости, т.е. не прибегая к торможению, плавным поворотом рулевого колеса вернуть автомобиль на проезжую часть. Торможение в данной ситуации может вызвать занос автомобиля.
    20. Раствор йода или бриллиантовой зелени вызывает химическое повреждение ткани внутри раны. Наружный слой кожи не повреждается при смазывании этими растворами, но эффективно дезинфицируется, что необходимо перед наложением марлевой повязки.

Здесь знак подчеркивания '_' в начале параграфа является меткой для поиска в одном из примеров.

  1. Настроил свойства файла TextDocument.txt так
    • Build Action = None
    • Copy to Output Directory=Copy if newe
  1. Заполнил (последовательно, думая, соображая!) файл XAML так
5. <Window x:Class="WpfText6.Window1"6. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"7. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"8. Title="Window1" 9. Height="300" 10. Width="300"11. MinHeight="300"12. MinWidth="300"13. ResizeMode="CanResizeWithGrip"14. Loaded="Window_Loaded"15. >16. <TabControl>17. 18. <TabItem Header="OneParagraph">19. <Grid>20. <Grid.ColumnDefinitions>21. <ColumnDefinition />22. <ColumnDefinition Width="50" />23. </Grid.ColumnDefinitions>24. <FlowDocumentScrollViewer 25. DockPanel.Dock="Left"26. x:Name="flowDocumentScrollViewer" 27. ScrollViewer.VerticalScrollBarVisibility="Visible"28. >29. <FlowDocument Name="flowDoc" TextAlignment="Left" Background="White">30. <Paragraph TextAlignment="Center" FontWeight="Bold" FontSize="21">31. Чтение одного параграфа32. </Paragraph>33. <Paragraph Name="text" FontFamily="Arial" />34. </FlowDocument>35. </FlowDocumentScrollViewer>36. <ListBox Grid.Column="1" Name="listBox" 37. SelectionChanged="listBox_SelectionChanged" />38. </Grid>39. </TabItem>40. 41. <TabItem Header="FullDocument">42. <FlowDocument Name="fullDocument" Loaded="fullDocument_Loaded" />43. </TabItem>44. 45. <TabItem Header="SplitDocument">46. <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">47. <FlowDocument Name="splitDocument" 48. Loaded="splitDocument_Loaded" Background="White" />49. </FlowDocumentScrollViewer>50. </TabItem>51. 52. <TabItem Header="ListDocument">53. <FlowDocumentScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">54. <FlowDocument Name="listDocument" 55. Initialized="listDocument_Initialized" Background="White" />56. </FlowDocumentScrollViewer>57. </TabItem>58. </TabControl></Window>
  1. Сочинил, думая!, кодовую часть так
60.using System;61.using System.Collections.Generic;62.using System.Text;63.using System.Windows;64.using System.Windows.Controls;65.using System.Windows.Data;66.using System.Windows.Documents;67.using System.Windows.Input;68.using System.Windows.Media;69.using System.Windows.Media.Imaging;70.using System.Windows.Navigation;71.using System.Windows.Shapes;72. 73.// Включаем дополнительные пространства имен74.using System.IO;75.using Microsoft.Win32;76.using System.Windows.Markup;77.using System.Collections;78. 79.namespace WpfText680.{81. public partial class Window1 : Window82. {83. public Window1()84. {85. InitializeComponent();86. }87. 88. // Вынесли как поля для видимости в методах89. FileStream myStream;90. StreamReader myStreamReader;91. String[] arrayText;92. private void Window_Loaded(object sender, RoutedEventArgs e)93. {94. this.Background = Brushes.LightGray;95. // Можно вместо разделителя '\\' использовать '/' 96. String fileName = "Documents/TextDocument.txt";97. 98. try99. {100. myStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);101. myStreamReader = new StreamReader(myStream, Encoding.GetEncoding(1251));102. 103. // Не знаем, какой массив задать, поэтому читаем в коллекцию104. // Но можно было и сразу в коллекцию StringBuilder.Append()105. ArrayList arrayList = new ArrayList();106. while (myStreamReader.EndOfStream != true)107. arrayList.Add(myStreamReader.ReadLine());// Читаем построчно108. 109. // Копируем ссылки на элементы ArrayList в массив110. arrayText = new String[arrayList.Count];111. for (int i = 0; i < arrayList.Count; i++)112. arrayText[i] = (String)arrayList[i];113. 114. // Заполняем ListBox115. for (int i = 0; i < arrayText.Length; i++)116. {117. int pos = arrayText[i].IndexOf('.');118. listBox.Items.Add(arrayText[i].Substring(0, pos + 1));119. }120. listBox.SelectedIndex = 0; // На первый элемент списка121. }122. catch { } // Один синтаксис!!!123. finally124. {125. // Системные ресурсы надо закрывать126. myStream.Close();127. myStreamReader.Close();128. }129. }130. 131. private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)132. {133. text.Inlines.Clear(); // Очищаем предыдущее содержимое134. text.Inlines.Add(arrayText[listBox.SelectedIndex]);// Добавляем новое135. }136. 137. private void fullDocument_Loaded(object sender, RoutedEventArgs e)138. {139. fullDocument.Background = Brushes.White;// Фон документа программно140. 141. for (int i = 0; i < arrayText.Length; i++)142. {143. Paragraph para = new Paragraph();144. para.FontFamily = new FontFamily("Arial");145. para.Inlines.Add(arrayText[i]);146. fullDocument.Blocks.Add(para);147. }148. }149. 150. String[] textSplit;151. private void splitDocument_Loaded(object sender, RoutedEventArgs e)152. {153. // Можно вместо разделителя '\\' использовать '/' 154. String fileName = "Documents/TextDocument.txt";155. 156. try157. {158. myStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);159. myStreamReader = new StreamReader(myStream, Encoding.GetEncoding(1251));160. 161. String str = myStreamReader.ReadToEnd();// Читаем весь файл162. textSplit = str.Split('_');// Расщепляем строку по метке '_'163. // Элемент textSplit[0] получился пустой164. }165. catch (Exception) { } // Другой синтаксис!!!166. finally167. {168. // Системные ресурсы надо закрывать169. myStream.Close();170. myStreamReader.Close();171. }172. 173. // Формируем заголовок программно174. Paragraph head = new Paragraph();175. head.TextAlignment = TextAlignment.Center;176. Run run = new Run("Документ получен расщеплением строки");177. run.FontSize = 21;178. Bold bold = new Bold(run);179. head.Inlines.Add(bold);180. splitDocument.Blocks.Add(head);181. 182. // Заполняем FlowDocument183. splitDocument.FontFamily = new FontFamily("Arial");184. for (int i = 1; i < textSplit.Length; i++)185. {186. Paragraph para = new Paragraph();187. para.Inlines.Add(textSplit[i]);188. splitDocument.Blocks.Add(para);189. }190. }191. 192. private void listDocument_Initialized(object sender, EventArgs e)193. {194. // Формируем заголовок195. Paragraph head = new Paragraph();196. head.TextAlignment = TextAlignment.Center;197. Run run = new Run("Нумерованный список OrderList");198. run.FontSize = 21;199. Bold bold = new Bold(run);200. head.Inlines.Add(bold);201. listDocument.Blocks.Add(head);202. 203. // Создаем и настраиваем список204. List list = new List();205. list.MarkerOffset = 25;// Отступ от маркеров206. list.MarkerStyle = TextMarkerStyle.Decimal;207. list.StartIndex = 3; // Нумерация с 3208. 209. // Заполняем список дочерними элементами210. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 1"))));211. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 2"))));212. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 3"))));213. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 4"))));214. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 5"))));215. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 6"))));216. list.ListItems.Add(new ListItem(new Paragraph(new Run("ListItem 7"))));217. 218. // Присоединяем список к документу219. listDocument.FontFamily = new FontFamily("Arial");220. listDocument.Blocks.Add(list);221. }222. }}
  • Разберитесь с кодом, или выкиньте мой и сочините свой, но чтобы все работало!

Результаты по примерам будут такими:

   
   
 

 

 

http://www.intuit.ru/studies/courses/596/452/info








Дата добавления: 2015-04-15; просмотров: 1203;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.