Я имею дело с ужасным <Run/>
в Silverlight 3 и мне приходится программно создавать <TextBlock>
и его строки:
Почему боялись? Потому что это не работает, я думаю, так, как вы ожидаете. В приведенном ниже примере А должно отображаться
BARN
(с причудливыми цветами для каждого персонажа), но вместо этого получается:
B A R N
ВЫСТАВКА A
<TextBlock FontFamily="Comic Sans MS" FontSize="88">
<Run Foreground="#A200FF">B</Run>
<Run Foreground="#FF0000">A</Run>
<Run Foreground="#FFC000">R</Run>
<Run Foreground="#FFFF00">N</Run>
</TextBlock>
Однако, что дает желаемый результат:
ВЫСТАВКА B
<TextBlock FontFamily="Comic Sans MS" FontSize="88">
<Run Foreground="#A200FF">B</Run><Run Foreground="#FF0000">A</Run><Run Foreground="#FFC000">R</Run><Run Foreground="#FFFF00">N</Run>
</TextBlock>
Глупо, а? В любом случае, это задокументировано @ Различия в обработке XAML между Silverlight 3 и Silverlight 4 в Обработка пробелов , где говорится:
Silverlight 3 обрабатывает пробелы больше
буквально в более широком диапазоне, в том числе
некоторые случаи, когда рассматривается CLRF
значительное. Это иногда приводило к
формат файла XAML с опущенным CRLF в
Для того, чтобы избежать нежелательных пробелов в
презентация, но которая не была
удобочитаемый при редактировании
сред. Silverlight 4 использует
более интуитивно понятный пробел
модель, которая похожа на WPF. это
модель сворачивается форматирование файла
пробел в большинстве случаев, с
исключение некоторых CLR-атрибутов
контейнеры, которые обрабатывают все пробелы
как значительный. Эта модель пробелов
дает среду редактирования больше
свобода вводить пробелы, которые
может улучшить форматирование кода XAML.
Также в Silverlight 4 есть текстовые элементы
которые позволяют еще больший контроль над
Проблемы с пропуском презентации.
Отлично, но я не использую SL4, потому что я создаю приложение WP7 программно. Да, мой XAML генерируется. Использование XML-литералов. Затем отправляется в строку. Как это:
Dim r1 As XElement = <Run Foreground="#A200FF">B</Run>
Dim r2 As XElement = <Run Foreground="#FF0000">A</Run>
Dim r3 As XElement = <Run Foreground="#FFC000">R</Run>
Dim r4 As XElement = <Run Foreground="#FFFF00">N</Run>
Dim tb = <TextBlock FontFamily="Comic Sans MS" FontSize="88">
<%= r1 %><%= r2 %><%= r3 %><%= r4 %>
</TextBlock>
Dim result = tb.ToString
После всего этого, вот мой вопрос: как я могу создать Приложение B вместо Приложения A. Этот текстовый блок станет частью большего числа элементов на странице XAML, поэтому часть .ToString
не совсем точна в это местоположение - это происходит, когда весь XAML для страницы управления пользователя выгружается в файл.
РЕДАКТИРОВАТЬ (6 мая 2011 г.): небольшой прогресс и щедрость
Я немного продвинулся, как показано ниже, но я наталкиваюсь на умственный блок здесь о том, как выполнить необычное разбиение и обработку XML для вывода строки. Возьмите этот новый пример:
<Canvas>
<Grid>
<TextBlock>
<Run Text="r"/>
<Run Text="u"/>
<Run Text="n"/>
</TextBlock>
<TextBlock>
<Run Text="far a"/>
<Run Text="way"/>
<Run Text=" from me"/>
</TextBlock>
</Grid>
<Grid>
<TextBlock>
<Run Text="I"/>
<Run Text=" "/>
<Run Text="want"/>
<LineBreak/>
</TextBlock>
<TextBlock>
<LineBreak/>
<Run Text="...thi"/>
<Run Text="s to"/>
<LineBreak/>
<Run Text=" work"/>
</TextBlock>
</Grid>
</Canvas>
Я хочу, чтобы выходная строка была:
<Canvas>
<Grid>
<TextBlock>
<Run Text="r"/><Run Text="u"/><Run Text="n"/>
</TextBlock>
<TextBlock>
<Run Text="far a"/><Run Text="way"/><Run Text=" from me"/>
</TextBlock>
</Grid>
<Grid>
<TextBlock>
<Run Text="I"/><Run Text=" "/><Run Text="want"/>
<LineBreak/>
</TextBlock>
<TextBlock>
<LineBreak/>
<Run Text="...thi"/><Run Text="s to"/>
<LineBreak/>
<Run Text=" work"/>
</TextBlock>
</Grid>
</Canvas>
Я смотрю на XMLWriter
и XMLWriterSettings
, основываясь на посте Эрика Уайта , который, кажется, является хорошим началом для пробежек (не включая потенциальные <LineBreak/>
с) , что также ставит меня в тупик). Как это:
Sub Main()
Dim myXML As XElement = <Canvas>
<Grid>
<TextBlock>
<Run Text="r"/>
<Run Text="u"/>
<Run Text="n"/>
</TextBlock>
<TextBlock>
<Run Text="far a"/>
<Run Text="way"/>
<Run Text=" from me"/>
</TextBlock>
</Grid>
</Canvas>
Console.Write(ToXMLString(myXML))
Console.ReadLine()
End Sub
Public Function ToXMLString(xml As XElement) As String
Dim tb As XElement = xml.Elements.<TextBlock>.FirstOrDefault
Dim xmlWriterSettings As New XmlWriterSettings
XmlWriterSettings.NewLineHandling = NewLineHandling.None
XmlWriterSettings.OmitXmlDeclaration = True
Dim sb As New StringBuilder
Using xmlwriter As XmlWriter = xmlwriter.Create(sb, XmlWriterSettings)
tb.WriteTo(xmlwriter)
End Using
Return sb.ToString
End Function
Но у меня есть огромная проблема, идущая гораздо дальше с выяснением, как разобрать это, чтобы получить желаемый результат выше.