Как я могу сохранить XamlReader.Load (xamlFile) от вставки дополнительных элементов Run? - PullRequest
1 голос
/ 14 февраля 2011

Представьте, что у меня есть 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 в окне просмотра, я вижу, что он вставляет прогоны между ними, которые по существу имеют пробел в качестве их содержимого, поэтому вместо трех строк, которые, как я ожидаю, внутри абзаца, есть 5.

Как можно избежать вставки этих пустых прогонов?

Примечание: я не могу сгруппировать эти три прогона в один, что было бы простым ответом из-за того, что они должны оставаться отдельными объектами.

Идеи


Решение : Как правильно ответил Аарон ниже, сгруппированная серия «Все прогоны» решает эту проблему. Кроме того, этот документ создавался на лету из других данных (более сложных, чем мой пример) и записывался с использованием XmlWriter, для которого свойство Indent XmlWriterSettings было установлено в true (потому что было легче увидеть выходные данные, чем все) запускать вместе) - если установить значение false, эти дополнительные прогоны будут исключены при чтении XamlReader.

Ответы [ 2 ]

1 голос
/ 12 января 2012

поставил вопрос; кто бы мог подумать, что 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 также получают специальную обработку, поскольку до или после них не вставляется пробел.

Очевидно, что удобная функция, в которой Inline захватывает необработанный XAML для его Run дочерних элементов, не побеждена, даже если (хотя бы один) Inline явно указан.

1 голос
/ 14 февраля 2011

Вы можете просто поместить все свои прогоны в одну строку ...

<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             
}
...