Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文本更改处理程序中更改选择开始_C#_Windows_Xaml_Textbox_Uwp - Fatal编程技术网

C# 在文本更改处理程序中更改选择开始

C# 在文本更改处理程序中更改选择开始,c#,windows,xaml,textbox,uwp,C#,Windows,Xaml,Textbox,Uwp,我正在编写一个基于TextBox的带有输入过滤的文本控件 其主要思想包括处理文本更改事件并设置正确的文本和SelectionStart值 在Windows10创建者更新之前,这一直有效。现在,当我在TextChangeing处理程序中更改SelectionStart时,我在UI中看到正确的插入符号位置,但下一个字符将转到旧位置 我现在无法共享任何代码,但您可以通过在每次文本更改调用中添加任意字符(并在该字符后设置SelectionStart)来复制代码 微软是否打破了向后兼容性?我做错什么了吗

我正在编写一个基于TextBox的带有输入过滤的文本控件

其主要思想包括处理文本更改事件并设置正确的文本和SelectionStart值

在Windows10创建者更新之前,这一直有效。现在,当我在TextChangeing处理程序中更改SelectionStart时,我在UI中看到正确的插入符号位置,但下一个字符将转到旧位置

我现在无法共享任何代码,但您可以通过在每次文本更改调用中添加任意字符(并在该字符后设置SelectionStart)来复制代码

微软是否打破了向后兼容性?我做错什么了吗

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;
}
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);