private TextControlSelection GetSelection() { var selection = AttachedFrameworkElement.GetValue <TextSelection>("Selection", BindingFlags.NonPublic | BindingFlags.Instance); var textRangeType = selection.GetType().GetInterfaces().FirstOrDefault(x => x.Name == "ITextRange"); var startTextPointer = textRangeType.GetValue <object>(selection, "Start"); var endEndTextPointer = textRangeType.GetValue <object>(selection, "End"); var start = startTextPointer.GetValue <int>("Offset", BindingFlags.Instance | BindingFlags.NonPublic); var end = endEndTextPointer.GetValue <int>("Offset", BindingFlags.Instance | BindingFlags.NonPublic); return(new TextControlSelection { Start = start, End = end }); }