CommentRangeStart
内容
[
隐藏
]CommentRangeStart class
表示具有关联注释的文本区域的开头。
要了解更多信息,请访问使用评论文档文章。
public sealed class CommentRangeStart : Node
构造函数
姓名 | 描述 |
---|---|
CommentRangeStart(DocumentBase, int) | 初始化此类的新实例。 |
特性
姓名 | 描述 |
---|---|
CustomNodeId { get; set; } | 指定自定义节点标识符。 |
virtual Document { get; } | 获取该节点所属的文档。 |
Id { get; set; } | 指定该区域链接到的注释的标识符。 |
virtual IsComposite { get; } | 返回真的 如果该节点可以包含其他节点. |
NextSibling { get; } | 获取紧随该节点的下一个节点。 |
override NodeType { get; } | 返回CommentRangeStart. |
ParentNode { get; } | 获取此节点的直接父节点。 |
PreviousSibling { get; } | 获取紧邻此节点之前的节点。 |
Range { get; } | 返回一个Range 表示此节点中包含的文档部分的对象。 |
方法
姓名 | 描述 |
---|---|
override Accept(DocumentVisitor) | 接受访客。 |
Clone(bool) | 创建节点的副本。 |
GetAncestor(NodeType) | 获取指定的第一个祖先NodeType . |
GetAncestor(Type) | 获取指定对象类型的第一个祖先。 |
virtual GetText() | 获取此节点及其所有子节点的文本。 |
NextPreOrder(Node) | 根据先序树遍历算法获取下一个节点。 |
PreviousPreOrder(Node) | 根据先序树遍历算法获取前一个节点。 |
Remove() | 将自身从父级中删除。 |
ToString(SaveFormat) | 将节点的内容导出为指定格式的字符串。 |
ToString(SaveOptions) | 使用指定的保存选项将节点的内容导出到字符串中。 |
评论
要创建锚定到文本区域的注释,您需要创建一个Comment
and 然后创建CommentRangeStart
和CommentRangeEnd
并将它们的标识符 设置为相同Id
价值。
CommentRangeStart
是一个内联级节点并且只能是Paragraph
。
例子
展示如何使用文档访问者打印所有注释的内容及其注释范围。
public void CreateCommentsAndPrintAllInfo()
{
Document doc = new Document();
Comment newComment = new Comment(doc)
{
Author = "VDeryushev",
Initial = "VD",
DateTime = DateTime.Now
};
newComment.SetText("Comment regarding text.");
// 将文本添加到文档中,将其扭曲到注释范围内,然后添加您的注释。
Paragraph para = doc.FirstSection.Body.FirstParagraph;
para.AppendChild(new CommentRangeStart(doc, newComment.Id));
para.AppendChild(new Run(doc, "Commented text."));
para.AppendChild(new CommentRangeEnd(doc, newComment.Id));
para.AppendChild(newComment);
// 添加两条对评论的回复。
newComment.AddReply("John Doe", "JD", DateTime.Now, "New reply.");
newComment.AddReply("John Doe", "JD", DateTime.Now, "Another reply.");
PrintAllCommentInfo(doc.GetChildNodes(NodeType.Comment, true));
}
/// <summary>
/// 迭代每个顶级评论并打印其评论范围、内容和回复。
/// </summary>
private static void PrintAllCommentInfo(NodeCollection comments)
{
CommentInfoPrinter commentVisitor = new CommentInfoPrinter();
// 迭代所有顶级注释。与回复类型评论不同,顶级评论没有祖先。
foreach (Comment comment in comments.Where(c => ((Comment)c).Ancestor == null))
{
// 首先,访问评论范围的开头。
CommentRangeStart commentRangeStart = (CommentRangeStart)comment.PreviousSibling.PreviousSibling.PreviousSibling;
commentRangeStart.Accept(commentVisitor);
// 然后,访问评论及其可能有的任何回复。
comment.Accept(commentVisitor);
foreach (Comment reply in comment.Replies)
reply.Accept(commentVisitor);
// 最后访问评论范围末尾,然后打印访问者的文本内容。
CommentRangeEnd commentRangeEnd = (CommentRangeEnd)comment.PreviousSibling;
commentRangeEnd.Accept(commentVisitor);
Console.WriteLine(commentVisitor.GetText());
}
}
/// <summary>
/// 打印文档中遇到的所有注释和注释范围的信息和内容。
/// </summary>
public class CommentInfoPrinter : DocumentVisitor
{
public CommentInfoPrinter()
{
mBuilder = new StringBuilder();
mVisitorIsInsideComment = false;
}
/// <summary>
/// 获取访问者积累的文档的纯文本。
/// </summary>
public string GetText()
{
return mBuilder.ToString();
}
/// <summary>
/// 在文档中遇到 Run 节点时调用。
/// </summary>
public override VisitorAction VisitRun(Run run)
{
if (mVisitorIsInsideComment) IndentAndAppendLine("[Run] \"" + run.Text + "\"");
return VisitorAction.Continue;
}
/// <summary>
/// 在文档中遇到 CommentRangeStart 节点时调用。
/// </summary>
public override VisitorAction VisitCommentRangeStart(CommentRangeStart commentRangeStart)
{
IndentAndAppendLine("[Comment range start] ID: " + commentRangeStart.Id);
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
return VisitorAction.Continue;
}
/// <summary>
/// 在文档中遇到 CommentRangeEnd 节点时调用。
/// </summary>
public override VisitorAction VisitCommentRangeEnd(CommentRangeEnd commentRangeEnd)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Comment range end] ID: " + commentRangeEnd.Id + "\n");
mVisitorIsInsideComment = false;
return VisitorAction.Continue;
}
/// <summary>
/// 在文档中遇到 Comment 节点时调用。
/// </summary>
public override VisitorAction VisitCommentStart(Comment comment)
{
IndentAndAppendLine(
$"[Comment start] For comment range ID {comment.Id}, By {comment.Author} on {comment.DateTime}");
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
return VisitorAction.Continue;
}
/// <summary>
/// 当文档中Comment节点的访问结束时调用。
/// </summary>
public override VisitorAction VisitCommentEnd(Comment comment)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Comment end]");
mVisitorIsInsideComment = false;
return VisitorAction.Continue;
}
/// <summary>
/// 将一行追加到 StringBuilder 并根据访问者在文档树中的深度对其进行缩进。
/// </summary>
/// <param name="text"></param>;
private void IndentAndAppendLine(string text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder.Append("| ");
}
mBuilder.AppendLine(text);
}
private bool mVisitorIsInsideComment;
private int mDocTraversalDepth;
private readonly StringBuilder mBuilder;
}
也可以看看
- class Node
- 命名空间 Aspose.Words
- 部件 Aspose.Words