我正在使用基于TextBox的输入过滤来编写文本控件。
主要思想包括处理TextChanging事件并设置正确的Text和SelectionStart值。
直到Windows 10 Creators更新才有效。现在,当我在TextChanging处理程序中更改SelectionStart时,我在UI中看到正确的插入位置,但下一个字符将转到旧位置。
我现在无法共享任何代码,但您可以通过在每个TextChanging调用上添加任意字符(并在此字符后设置SelectionStart)来重现它。
Microsoft是否破坏了向后兼容性?我做错了什么?
UPD:所以我找到了一个肮脏的解决方法:async void OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
var newText = HandleText(Text);
var newSelectionStart = HandleTextDiff(newText, Text);
Text = newText;
await Task.Yield();
SelectionStart = newSelectionStart;
}
Task.Yield使SelectionStart的赋值在控件内部赋值后异步运行。
这非常肮脏和丑陋,因为它会在某些情况下导致插入符号眨眼,但这是我能找到的唯一可行的解决方案。
答案 0 :(得分:0)
也许您应该尝试将SelectionLength设置为0
另一种选择可能是使用SetCaretPos Api电话
[DllImport("User32.dll")]
static extern bool SetCaretPos(int x, int y);