Как я могу удержать XamlReader.Load(xamlFile) от вставки дополнительных элементов Run?
Представьте, что у меня есть 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;
}
Какие результаты это:
Хотя то, что я хотел бы увидеть, выглядит примерно так:
но, изучив FlowDocument в окне просмотра, я вижу, что он вставляет прогоны между ними, которые по существу имеют пробел в качестве своего содержимого, поэтому вместо трех строк, которые я ожидаю внутри абзаца, их 5.
Как я могу избежать вставки этих пустых прогонов?
Примечание: я не могу сгруппировать эти три прогона в один, что было бы простым ответом, потому что они должны оставаться отдельными объектами.
Идеи?
Решение: Как правильно ответил Аарон ниже, эта проблема решается с помощью группировки "Все прогоны" на одной строке. Кроме того, этот документ создавался на лету из других данных (более сложных, чем мой пример) и записывался с использованием XmlWriter, для которого свойство Indent XmlWriterSettings было установлено в true (потому что было легче увидеть выходные данные, а не все). работает вместе) - установка его в false исключает эти дополнительные прогоны, когда он читается XamlReader.
2 ответа
Вы можете просто поместить все свои пробеги в одну линию...
<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
}
Поднял вопрос; кто бы мог подумать, что 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
явно указано.