2010-10-28 14 views
2

Quel serait le moyen le plus simple (et peut-être le plus rapide) d'obtenir un objet BlockCollection (espace de noms System.Windows.Documents) qui contient un objet Block-type donné?Obtention d'un objet BlockCollection contenant un objet Block

Je n'ai pas trouvé de moyen direct de le faire en utilisant ce qui est disponible sur la classe Block.

public static BlockCollection FindContainingCollection(Block block) 
{ 
    // ???   
} 

Répondre

1

Parce que ça fait un mois que j'ai posté ceci et que je n'ai pas eu de réponse, je posterai ce que j'ai fini par faire. C'est plutôt stupide d'avoir écrit de cette façon, mais je n'ai pas trouvé de moyen plus simple de l'implémenter, principalement parce que la propriété Blocks n'est pas exposée via une interface commune.

public BlockCollection FindContainingCollection(Block block) 
    { 
     BlockCollection blocks = null; 

     FlowDocument flowDoc = block.Parent as FlowDocument; 

     if (flowDoc != null) 
      blocks = flowDoc.Blocks; 
     else 
     { 
      TableCell tableCell = block.Parent as TableCell; 
      if (tableCell != null) 
       blocks = tableCell.Blocks; 
      else 
      { 
       ListItem listItem = block.Parent as ListItem; 
       if (listItem != null) 
        blocks = listItem.Blocks; 
       else 
       { 
        Section section = block.Parent as Section; 
        if (section != null) 
         blocks = section.Blocks; 
        else 
        { 
         Figure figure = block.Parent as Figure; 
         if (figure != null) 
          blocks = figure.Blocks; 
         else 
         { 
          Floater floater = block.Parent as Floater; 
          if (floater != null) 
           blocks = floater.Blocks; 
         } 
        } 
       } 
      } 
     } 

     return blocks; 
    } 
-1

Le bloc a une propriété SiblingBlocks qui fait ce dont vous avez besoin.

BlockCollection containingCollection = block.SiblingBlocks 

https://msdn.microsoft.com/en-us/library/system.windows.documents.block.siblingblocks(v=vs.100).aspx

+0

Bien que ce lien peut répondre à la question, il est préférable d'inclure les éléments essentiels de la réponse ici et de fournir le lien de référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – Lamorak

+0

Avoir modifié pour inclure un exemple de code. C'est juste une propriété donc la méthode dans la question n'a pas besoin d'exister. – Doug

0

Utilisez ElementAt(int32)

for(int i = 0; i < blocks.Count; i++) { 
    Block block = blocks.ElementAt(i); 
    Console.WriteLine("{0}", block.GetType()); 
}