/// <summary> /// Returns a TextPointer at the start of line after skipping /// a given number of line starts in forward or backward direction. /// </summary> /// <param name="count"> /// Offset of the destination line. Negative values specify preceding /// lines, zero specifies the current line, positive values specify /// following lines. /// </param> /// <param name="actualCount"> /// The offset of the line moved to. This value may be less than /// requested if the beginning or end of document is encountered. /// </param> /// <returns> /// TextPointer positioned at the begining of a line requested /// (with LogicalDirection set to Forward). /// If there is no sufficient lines in requested direction, /// returns a position at the beginning of a farthest line /// in this direction. In such case out parameter actualCount /// gets a number of lines actually skipped. /// Unlike the other override in this case the returned pointer is never null. /// </returns> /// <remarks> /// If this TextPointer is at an otherwise ambiguous position, exactly /// between two lines, the LogicalDirection property is used to determine /// current position. So a TextPointer with backward LogicalDirection /// is considered to be at the end of line, and calling MoveToLineBoundary(0) /// would reposition it at the start of the preceding line. Making the /// same call with forward LogicalDirection would leave the TextPointer /// positioned where it started -- at the start of the following line. /// </remarks> public TextPointer GetLineStartPosition(int count, out int actualCount) { this.ValidateLayout(); TextPointer position = new TextPointer(this); if (this.HasValidLayout) { actualCount = position.MoveToLineBoundary(count); } else { actualCount = 0; } position.SetLogicalDirection(LogicalDirection.Forward); position.Freeze(); return position; }