如何让XamlReader.Load(xamlFile)不要插入额外的Run元素?

时间:2011-02-14 19:29:03

标签: wpf flowdocument xamlreader flowdocumentreader

想象一下,我有一个像这样的FlowDocument:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              ColumnWidth="400" FontSize="14" FontFamily="Georgia"
              Name="document">
    <Paragraph KeepTogether="True">
        <Run>ABC</Run>
        <Run>DEF</Run>
        <Run>GHI</Run>
    </Paragraph>
</FlowDocument>

我加载它就像这样:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        FileStream xamlFile = new FileStream("FlowDocument1.xaml", FileMode.Open);
        FlowDocument content = XamlReader.Load(xamlFile) as FlowDocument;
        fdReader.Document = content;
    }

结果是什么:

enter image description here

虽然我希望看到的是这样的事情:

enter image description here

但是在检查观察窗口中的FlowDocument时,我看到它在它们之间插入了基本上有空格作为其内容的运行,所以不是在段落中有3个内联,而是有5个< / p>

如何避免插入空白行?

注意:我无法将这三个游戏组合成一个单独的游戏,这很容易回答,因为它们需要保持独立的对象。

想法?


解决方案:正如Aaron在下面正确回答的那样,将运行全部分组到一行就解决了这个问题。顺便说一句,这个文档是在其他数据(比我的例子更复杂)的基础上构建的,并使用XmlWriter写出来,它将XmlWriterSettings属性设置为true(因为它更容易看到输出而不是全部一起运行) - 将它设置为false可以在XamlReader读入时删除那些额外的运行。

2 个答案:

答案 0 :(得分:1)

您可以简单地将所有行程放在一行......

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              ColumnWidth="400" FontSize="14" FontFamily="Georgia"
              Name="document">
    <Paragraph KeepTogether="True">
        <Run>ABC</Run><Run>DEF</Run><Run>GHI</Run>
    </Paragraph>
</FlowDocument>

然后,您可以通过InlineCollection ...

访问每次运行
foreach (var run in ((Paragraph)content.Blocks.FirstBlock).Inlines)
{
   //do stuff with run             
}

答案 1 :(得分:1)

提出问题;谁会猜到XAML:

<TextBlock.Inlines><Run Text="[" /><Run Text="0" /><Run Text="-" /><Run Text="2" /><Run Text="]" /></TextBlock.Inlines>

会给出不同的结果:

<TextBlock.Inlines>
    <Run Text="[" />
    <Run Text="0" />
    <Run Text="-" />
    <Run Text="2" />
    <Run Text="]" />
</TextBlock.Inlines>

第一个给出“[0-2]”而第二个给出“[0-2]”。请特别注意,在第二种情况下,第一个和最后一个Run也会得到特殊处理,因为在这些之前(或之后)没有插入空格。

显然,即使明确提供(至少一个)InlineRun抓取其Inline个孩子的原始XAML的便利功能也不会失败。