在TextChanging处理程序中更改SelectionStart

时间:2017-05-14 09:45:05

标签: c# windows xaml textbox uwp

我正在使用基于TextBox的输入过滤来编写文本控件。

主要思想包括处理TextChanging事件并设置正确的Text和SelectionStart值。

直到Windows 10 Creators更新才有效。现在,当我在TextChanging处理程序中更改SelectionStart时,我在UI中看到正确的插入位置,但下一个字符将转到旧位置。

我现在无法共享任何代码,但您可以通过在每个TextChanging调用上添加任意字符(并在此字符后设置SelectionStart)来重现它。

Microsoft是否破坏了向后兼容性?我做错了什么?

UPD:所以我找到了一个肮脏的解决方法:

async void OnTextChanging(TextBox sender, Text​Box​Text​Changing​Event​Args args)
{
    var newText = HandleText(Text);
    var newSelectionStart = HandleTextDiff(newText, Text);
    Text = newText;

    await Task.Yield();
    SelectionStart = newSelectionStart;
}

Task.Yield使SelectionStart的赋值在控件内部赋值后异步运行。

这非常肮脏和丑陋,因为它会在某些情况下导致插入符号眨眼,但这是我能找到的唯一可行的解​​决方案。

1 个答案:

答案 0 :(得分:0)

也许您应该尝试将SelectionLength设置为0

另一种选择可能是使用SetCaretPos Api电话

[DllImport("User32.dll")] 
static extern bool SetCaretPos(int x, int y);