Comment puis-je empêcher xamlreader.load (xamlfile) d'insérer des éléments de course supplémentaires?

StackOverflow https://stackoverflow.com/questions/4996390

Question

Imaginez que j'ai un document de flux comme tel:

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

Et je le charge comme ça:

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

Ce qui est le suivant:

enter image description here

Alors que ce que j'aimerais voir est quelque chose comme ça:

enter image description here

Mais en examinant le DoadDocument dans la fenêtre de la montre, je vois qu'il insère des fonctions entre eux qui ont essentiellement un espace comme contenu, donc plutôt qu'il y a les 3 inclinaisons que j'attends à l'intérieur du paragraphe, il y en a 5.

Comment puis-je éviter que ces courses vierges soient insérées?

Remarque: Je ne peux pas vraiment regrouper ces trois sont les résultats en un seul, ce qui serait la réponse facile, en raison du fait qu'ils doivent rester des objets séparés.

Idées?


La solution: Comme Aaron a répondu correctement ci-dessous, le regroupement des exécutions sur une seule ligne résout ce problème. En passant, ce document était en cours de construction à la volée à partir d'autres données (plus complexes que mon exemple) et écrite à l'aide d'un XMLWriter qui avait le retrait de la propriété XMLWRERTERSINGS sur True (car il était plus facile de voir la sortie plutôt que tout cela En cours d'exécution) - Le régler sur False élimine ces exécutions supplémentaires lorsqu'elle est lue par le xamlreader.

Était-ce utile?

La solution

Vous pouvez simplement placer toutes vos courses sur une seule ligne ...

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

Vous pouvez ensuite accéder à chaque exécution via le InlineCollection...

foreach (var run in ((Paragraph)content.Blocks.FirstBlock).Inlines)
{
   //do stuff with run             
}

Autres conseils

A fait voter la question; Qui aurait deviné que le xaml:

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

donnerait un résultat différent de:

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

Le premier donne [0-2] tandis que le second donne [0 - 2]. Notez, surtout, que dans le deuxième cas, le premier et le dernier Run Obtenez également un traitement spécial, car il n'y a pas d'espace inséré avant (ou après) ceux-ci.

De toute évidence, la fonction de commodité où le Inline attrape du xaml brut pour son Run Les enfants ne sont pas vaincus, même lorsque (au moins un) Inline est explicitement fourni.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top