void Control_EditingChanged(object sender, EventArgs e) { var element = ((FormattedNumberEntry)Element); // Oh boy, thank you internet: http://stackoverflow.com/a/34922332 // 1. Stop listening for changes on our control Text property if (!element.ShouldReactToTextChanges) { return; } element.ShouldReactToTextChanges = false; // 2. Get the current cursor position var selectedRange = Control.SelectedTextRange; // 3. Take the control’s text, lets name it oldText var oldText = Control.Text; // 4. Parse oldText into a number, lets name it number var number = FormattedNumberEntry.DumbParse(oldText); element.Value = number; // 5. Format number, and place the formatted text in newText var newText = $"{number:#,##0}"; // 6. Set the Text property of our control to newText Control.Text = newText; // 7. Calculate the new cursor position var change = -1 * (oldText.Length - newText.Length); var newPosition = Control.GetPosition(selectedRange.Start, (nint)change); // 8. Set the new cursor position if (newPosition != null) // before we fail miserably { Control.SelectedTextRange = Control.GetTextRange(newPosition, newPosition); } // 9. Start listening for changes on our control’s Text property element.ShouldReactToTextChanges = true; }
private void Control_TextChanged(object sender, Windows.UI.Xaml.Controls.TextChangedEventArgs e) { var element = ((FormattedNumberEntry)Element); // 1. Stop listening for changes on our control Text property if (!element.ShouldReactToTextChanges) { return; } element.ShouldReactToTextChanges = false; // 2. Get the current cursor position var cursorPosition = Control.SelectionStart; // 3. Take the control’s text, lets name it oldText var oldText = Control.Text; // 4. Parse oldText into a number, lets name it number var number = FormattedNumberEntry.DumbParse(oldText); element.Value = number; // 5. Format number, and place the formatted text in newText var newText = $"{number:#,##0}"; // 6. Set the Text property of our control to newText Control.Text = newText; // 7. Calculate the new cursor position var change = -1 * (oldText.Length - newText.Length); if (cursorPosition + change < 0) { change = 0; } // 8. Set the new cursor position Control.SelectionStart = cursorPosition + change; // 9. Start listening for changes on our control’s Text property element.ShouldReactToTextChanges = true; }