Получение объекта BlockCollection, который содержит объект Block - PullRequest
2 голосов
/ 28 октября 2010

Каким будет самый простой (и, возможно, быстрый) способ получить объект BlockCollection (пространство имен System.Windows.Documents), который содержит данный объект типа Block?

Я не смог найти какой-либо прямой способ сделать это, используя то, что доступно в классе Block.

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

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

Поскольку с тех пор, как я отправил это сообщение и не получил ответа, прошел месяц, я опубликую то, что в итоге сделал. Это довольно глупо, что я написал таким образом, но я не мог найти более чистый способ его реализации, в основном потому, что свойство Blocks не предоставляется через общий интерфейс.

    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;
    }
0 голосов
/ 20 сентября 2017

Использование ElementAt (int32)

for(int i = 0; i < blocks.Count; i++) {
    Block block = blocks.ElementAt(i);
    Console.WriteLine("{0}", block.GetType());
}
0 голосов
/ 12 августа 2015

Блок имеет свойство SiblingBlocks, которое делает все что вам нужно.

BlockCollection containingCollection = block.SiblingBlocks

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

...