Я имею дело с ужасным <Run/>
в Silverlight 3 и должен программно создать <TextBlock>
и его встроенные строки:
Зачем бояться? Потому что это не работает, я думаю, так, как вы ожидали. В приведенной ниже таблице A должно быть указано
BARN(с причудливыми цветами для каждого символа), но вместо этого оно выражается:
B A R N
EXHIBIT 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>
Что дает желаемый результат, тем не менее:
EXHIBIT 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 вместо Exhibit A. Этот текстовый блок станет частью большего количества элементов на странице XAML, поэтому часть .ToString
не совсем точна в это место - это происходит, когда все XAML для пользовательской страницы управления выгружаются в файл.
EDIT (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
, на основе Eric White post, который, кажется, хороший старт для пробегов (не включая потенциал <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
Но у меня возникла огромная проблема, которая идет гораздо дальше с выяснением того, как разобрать это, чтобы вывести желаемый результат выше.