有没有办法将多个XElement序列化到同一行?
|
我正在处理Silverlight 3中令人恐惧的
<Run/>
,并且必须以编程方式创建<TextBlock>
及其内联:
为什么害怕?我想,因为它不起作用,所以您期望的那样。下面的图表A应该产生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>
愚蠢吧?无论如何,这在Whitespace Handling下记录了@XAML Silverlight 3和Silverlight 4之间的处理差异,其中指出:
Silverlight 3更对待空白
实际上,范围更广,包括
在某些情况下,考虑使用CLRF
重大。这有时导致
省略CRLF的文件格式XAML
为了避免不必要的空格
演示文稿,但不是
在编辑中易于阅读
环境。 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被踢出文件时发生。
编辑(2011年5月6日):有所进展和赏金
我已经取得了一些进步,如下所示,但是我在这里遇到了一个难题:如何完成不寻常的拆分和处理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>
根据埃里克·怀特(Eric White)的帖子,我一直在看XMLWriter
和ѭ9which,这似乎是比赛的一个不错的开端(尚不包括潜在的<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
但是,在弄清楚如何解析它以产生上面期望的输出时,我还有一个更大的问题。
没有找到相关结果
已邀请:
5 个回复
玖料萄
以下是VB.NET示例程序的完整列表。另外,我写了一篇博客文章,《使用LINQ to XML的XML自定义格式》,展示了等效的C#代码。 `
`
悸翠疮武昏
元素,并获得字符串表示形式。然后扫描以查找连续的
元素并将它们“合并”在一起。然后,完成此操作后,“取消注释”所有
元素。
并输出:
蹦吃舷弦
重载,该重载允许您指定
,以便禁用格式化。但是我认为您不能为单个
设置保存选项。您将必须像以前一样手动写出字符串。这只是部分实现,尽管它只将TextBlocks全部写在一行上。那会是可接受的格式吗?
并输出:
栖很钾是狠
佬棠
VB.NET(我使用了developerfusion转换器,所以请多多包涵):