Navegação com Cursor
Ao trabalhar com um documento, mesmo que seja curto ou longo, você precisará navegar pelo documento. A navegação com um cursor virtual representa a capacidade de navegar entre diferentes nós em um documento.
Dentro de um documento curto, mover-se em um documento é simples, pois você pode mover o ponto de inserção usando as teclas de seta do teclado ou clicando com o mouse para localizar o ponto de inserção onde desejar. Mas quando você tiver um documento grande com muitas páginas, essas técnicas básicas serão insuficientes.
Este artigo explica como navegar em um documento e navegar com um cursor virtual para diferentes partes dele.
Detectando a posição atual do cursor
Antes de iniciar o processo de navegação pelo seu documento, você precisará obter o nó que está selecionado no momento. Você pode obter a posição exata do cursor em um nó selecionado usando a propriedade CurrentNode. Além disso, em vez de obter o nó atual, você pode obter o parágrafo atualmente selecionado ou a seção atualmente selecionada usando as propriedades CurrentParagraph e CurrentSection.
Quaisquer operações de inserção executadas usando o DocumentBuilder serão inseridas antes do CurrentNode. Quando o parágrafo atual está vazio ou o cursor está posicionado logo antes do final do parágrafo, o CurrentNode retorna nulo.
Navegando pelos métodos em um documento
Ao editar texto, é importante saber como navegar no documento e para onde exatamente se mover nele. Aspose.Words permite que você se mova em um documento e navegue por suas diferentes seções e partes – isso é semelhante à funcionalidade do Painel de Navegação no Microsoft Word para ir para uma página ou título em um documento do Word sem rolar.
O método principal é poder mover a posição do cursor para um nó específico em seu documento. Você pode conseguir isso usando o método MoveTo.
O exemplo de código a seguir mostra como mover o DocumentBuilder para nós diferentes em um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Start a bookmark and add content to it using a DocumentBuilder. | |
builder.StartBookmark("MyBookmark"); | |
builder.Writeln("Bookmark contents."); | |
builder.EndBookmark("MyBookmark"); | |
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark. | |
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkEnd, builder.CurrentParagraph.FirstChild); | |
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this. | |
builder.MoveToBookmark("MyBookmark"); | |
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it. | |
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkStart, builder.CurrentParagraph.FirstChild); | |
// We can move the builder to an individual node, | |
// which in this case will be the first node of the first paragraph, like this. | |
builder.MoveTo(doc.FirstSection.Body.FirstParagraph.GetChildNodes(NodeType.Any, false)[0]); | |
Assert.AreEqual(NodeType.BookmarkStart, builder.CurrentNode.NodeType); | |
Assert.IsTrue(builder.IsAtStartOfParagraph); | |
// A shorter way of moving the very start/end of a document is with these methods. | |
builder.MoveToDocumentEnd(); | |
Assert.IsTrue(builder.IsAtEndOfParagraph); | |
builder.MoveToDocumentStart(); | |
Assert.IsTrue(builder.IsAtStartOfParagraph); |
Mas além do método MoveTo básico, existem outros mais específicos.
Navegue até o início ou fim de um documento
Você pode ir para o início ou final do seu documento usando os métodos MoveToDocumentStart e MoveToDocumentEnd.
O exemplo de código a seguir mostra como mover a posição do cursor para o início ou final de um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Move the cursor position to the beginning of your document. | |
builder.MoveToDocumentStart(); | |
Console.WriteLine("\nThis is the beginning of the document."); | |
// Move the cursor position to the end of your document. | |
builder.MoveToDocumentEnd(); | |
Console.WriteLine("\nThis is the end of the document."); |
Navegue com marcadores
Você pode marcar um local que deseja encontrar e movê-lo novamente com facilidade. Você pode inserir quantos marcadores desejar em seu documento e navegar por eles identificando os marcadores com nomes exclusivos. Você pode ir para um marcador usando o método MoveToBookmark.
Os exemplos de código a seguir mostram como mover a posição do cursor para um marcador:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Start a bookmark and add content to it using a DocumentBuilder. | |
builder.StartBookmark("MyBookmark"); | |
builder.Writeln("Bookmark contents."); | |
builder.EndBookmark("MyBookmark"); | |
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark. | |
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkEnd, builder.CurrentParagraph.FirstChild); | |
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this. | |
builder.MoveToBookmark("MyBookmark"); | |
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it. | |
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkStart, builder.CurrentParagraph.FirstChild); | |
// We can move the builder to an individual node, | |
// which in this case will be the first node of the first paragraph, like this. | |
builder.MoveTo(doc.FirstSection.Body.FirstParagraph.GetChildNodes(NodeType.Any, false)[0]); |
Navegue até as células da tabela
Você pode ir para uma célula da tabela usando o método MoveToCell. Este método permitirá que você navegue com o cursor em qualquer célula de uma tabela específica. Além disso, você pode especificar um índice para mover o cursor para qualquer posição ou caractere especificado em uma célula dentro do método MoveToCell.
O exemplo de código a seguir mostra como mover a posição do cursor para uma célula especificada da tabela:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(MyDir + "Tables.docx"); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Move the builder to row 3, cell 4 of the first table. | |
builder.MoveToCell(0, 2, 3, 0); | |
builder.Write("\nCell contents added by DocumentBuilder"); | |
Table table = (Table)doc.GetChild(NodeType.Table, 0, true); | |
Assert.AreEqual(table.Rows[2].Cells[3], builder.CurrentNode.ParentNode.ParentNode); | |
Assert.AreEqual("Cell contents added by DocumentBuilderCell 3 contents\a", table.Rows[2].Cells[3].GetText().Trim()); |
Navegue até um campo
Você pode ir para um campo específico em seu documento usando o método MoveToField. Além disso, você pode passar para um campo de mesclagem específico usando o método MoveToMergeField.
O exemplo de código a seguir mostra como mover o cursor do construtor de documentos para um campo específico:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Insert a field using the DocumentBuilder and add a run of text after it. | |
Field field = builder.InsertField("MERGEFIELD field"); | |
builder.Write(" Text after the field."); | |
// The builder's cursor is currently at end of the document. | |
Assert.Null(builder.CurrentNode); | |
// We can move the builder to a field like this, placing the cursor at immediately after the field. | |
builder.MoveToField(field, true); | |
// Note that the cursor is at a place past the FieldEnd node of the field, meaning that we are not actually inside the field. | |
// If we wish to move the DocumentBuilder to inside a field, | |
// we will need to move it to a field's FieldStart or FieldSeparator node using the DocumentBuilder.MoveTo() method. | |
Assert.AreEqual(field.End, builder.CurrentNode.PreviousSibling); | |
builder.Write(" Text immediately after the field."); |
Navegue até um cabeçalho ou rodapé
Você pode ir para o início de um cabeçalho ou rodapé usando o método MoveToHeaderFooter
O exemplo de código a seguir mostra como mover o cursor do construtor de documentos para um cabeçalho ou rodapé de documento:
Navegue até uma seção ou parágrafo
Você pode ir para uma seção ou parágrafo específico usando os métodos MoveToParagraph ou MoveToSection. Além disso, você pode especificar um índice para mover o cursor para qualquer posição ou caractere especificado em um parágrafo dentro do método MoveToParagraph.
O exemplo de código a seguir mostra como mover para uma seção específica e um parágrafo específico em um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Document doc = new Document(); | |
doc.AppendChild(new Section(doc)); | |
// Move a DocumentBuilder to the second section and add text. | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.MoveToSection(1); | |
builder.Writeln("Text added to the 2nd section."); | |
// Create document with paragraphs. | |
doc = new Document(MyDir + "Paragraphs.docx"); | |
ParagraphCollection paragraphs = doc.FirstSection.Body.Paragraphs; | |
Assert.AreEqual(22, paragraphs.Count); | |
// When we create a DocumentBuilder for a document, its cursor is at the very beginning of the document by default, | |
// and any content added by the DocumentBuilder will just be prepended to the document. | |
builder = new DocumentBuilder(doc); | |
Assert.AreEqual(0, paragraphs.IndexOf(builder.CurrentParagraph)); | |
// You can move the cursor to any position in a paragraph. | |
builder.MoveToParagraph(2, 10); | |
Assert.AreEqual(2, paragraphs.IndexOf(builder.CurrentParagraph)); | |
builder.Writeln("This is a new third paragraph. "); | |
Assert.AreEqual(3, paragraphs.IndexOf(builder.CurrentParagraph)); |