C# 在文本更改处理程序中更改选择开始
我正在编写一个基于TextBox的带有输入过滤的文本控件 其主要思想包括处理文本更改事件并设置正确的文本和SelectionStart值 在Windows10创建者更新之前,这一直有效。现在,当我在TextChangeing处理程序中更改SelectionStart时,我在UI中看到正确的插入符号位置,但下一个字符将转到旧位置 我现在无法共享任何代码,但您可以通过在每次文本更改调用中添加任意字符(并在该字符后设置SelectionStart)来复制代码 微软是否打破了向后兼容性?我做错什么了吗 UPD:所以我找到了一个肮脏的解决办法:C# 在文本更改处理程序中更改选择开始,c#,windows,xaml,textbox,uwp,C#,Windows,Xaml,Textbox,Uwp,我正在编写一个基于TextBox的带有输入过滤的文本控件 其主要思想包括处理文本更改事件并设置正确的文本和SelectionStart值 在Windows10创建者更新之前,这一直有效。现在,当我在TextChangeing处理程序中更改SelectionStart时,我在UI中看到正确的插入符号位置,但下一个字符将转到旧位置 我现在无法共享任何代码,但您可以通过在每次文本更改调用中添加任意字符(并在该字符后设置SelectionStart)来复制代码 微软是否打破了向后兼容性?我做错什么了吗
async void OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
var newText = HandleText(Text);
var newSelectionStart = HandleTextDiff(newText, Text);
Text = newText;
await Task.Yield();
SelectionStart = newSelectionStart;
}
Yield使SelectionStart的分配在控件内部分配之后异步运行
这是非常肮脏和丑陋的,因为它在某些情况下会导致插入符号闪烁,但这是我能找到的唯一有效解决方案。也许您应该尝试将SelectionLength设置为0 另一种选择可能是使用Api调用
也许您应该尝试将SelectionLength设置为0 另一种选择可能是使用Api调用
如果您正在编写控件,仅处理TextChanged事件可能不够。@LeiYang请解释。如果您正在编写控件,仅处理TextChanged事件可能不够。@LeiYang请解释。设置SelectionLength和SelectionStart相当于TextBox。Select(int,int)调用。所以它不起作用。文本更改结束后,UI选择正确,但键入的选择被破坏。设置SelectionLength和SelectionStart相当于TextBox。选择(int,int)调用。所以它不起作用。文本更改结束后,UI选择正确,但键入选择被破坏。
[DllImport("User32.dll")]
static extern bool SetCaretPos(int x, int y);