Getting the cursor row and column position in a UWP TextBox


Getting the cursor row and column position in a UWP TextBox

In learning what UWP has to offer in 2019 I started putting together a clone of Notepad which I quickly deciding to start adding more functionality to. One of things I wanted to do was find the current position of the cursor in the TextBox. After about 30 minutes the below is what I ended up settling on. I ran a couple of variations of looping through the performance profiler on large documents and what's below was what I ended up on. As we don't have access to the internals of the TextBox this was best way I could figure out to get this working.

Note of course, being at the end of the string would require the loop to go much farther. I tested on a document with 12,000 rows and over 230,000 characters and it didn't seem to slow the UI down (on a 2nd generation Core i7 from 2011). In some cases we're forced to work with what we have and not what we want.

CursorPosition Extension Method

/// <summary>
/// Returns the current column position on the current line the cursor is on.
/// </summary>
public static CursorPosition CursorPosition(this TextBox tb)
{
    int endMarker = tb.SelectionStart;

    if (endMarker == 0)
    {
        return new CursorPosition(1, 1);
    }

    int i = 0;
    int col = 1;
    int row = 1;

    foreach (char c in tb.Text)
    {
        i++;
        col++;

        if (c == '\r')
        {
            row++;
            col = 1;
        }

        if (i == endMarker)
        {
            return new CursorPosition(row, col);
        }
    }

    return new CursorPosition(row, col);
}

CursorPosition Class

public class CursorPosition
{
    public CursorPosition()
    {

    }

    public CursorPosition(int row, int column)
    {
        Row = row;
        Column = column;
    }

    public int Row { get; set; } = 1;

    public int Column { get; set; } = 1;

}