Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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#_Wpf_Xaml_Textbox - Fatal编程技术网

C# 如何仅从文本框中获取新文本?

C# 如何仅从文本框中获取新文本?,c#,wpf,xaml,textbox,C#,Wpf,Xaml,Textbox,如何仅从文本框中获取新文本 像这样的 private void tbLog_TextChanged(object sender, TextChangedEventArgs e) { //Get only NEW text added to Log } /* LOG old message... old message... old message... old message... NEW message... NEW messa

如何仅从文本框中获取新文本

像这样的

private void tbLog_TextChanged(object sender, TextChangedEventArgs e)
{
    //Get only NEW text added to Log
}

/*
    LOG
    old message...
    old message...
    old message...
    old message...
    NEW message...
    NEW message...
    NEW message...
    NEW message...
    NEW message...
*/  

对于桌面WPF文本框,您应该能够使用枚举更改。注:单个事件可能包含多个更改


该类具有Offset、AddedLength和RemovedLength属性,这些属性为您提供了更改的字符的确切范围。

也许您应该使用该属性:

private string old_text = "";

private void tbLog_TextChanged(object sender, TextChangedEventArgs e)
{
    if(old_text != tbLog.Text)
    {
        writeLog(tbLog.Text);
        old_text = tbLog.Text;
    }
}

也许你想澄清你所说的“新”是什么意思。您的意思是,自从上次触发TextChanged事件以来,在末尾添加了任何新文本吗?顺便说一句,也许看看textchangedventargs.Changes属性。我正在研究它,但我无法让调试器中断,以便我可以看到e.Changes中的内容。我只想要触发TextChanged事件的新文本。我希望在一次点击中避免那么多数据。这样做,我每次都会处理和写入整个文本框。文本框中有多少数据?然后使用
KeyDown
事件捕获按键并自己记录(同时保存光标位置)。请注意,如果您允许复制粘贴等操作,这可能会变得很棘手。您的文本是否也有那么长?我的日志中没有键入内容,它会在任务运行时由其他对象更新。没有键盘输入怎么办?啊。。。那你就完蛋了。您必须处理全文,或者让您的其他对象只发送更改的部分。这非常奇怪。我尝试过这个解决方案,但和我尝试过的其他方法一样,当事件触发时,没有任何东西起作用。当触发事件时,它甚至不会接受断点。我在整个过程中添加了这个和一个常规异常,因此不会抛出任何错误
foreach(newTexts中的var-txt){MessageBox.Show(txt);}
。日志正在更新。。当我删除所有代码并保留自动滚动代码时,这是可行的,但其他的都不行。即使我只是把
MessageBox.Show(“我工作过”),没有,没有MB…我必须道歉。我不知道是怎么回事。。但是VS一定是出了故障或是什么的。“自动滚动到结束”代码只在我调试的50%左右开始工作,然后就停止了。我去了一趟,发现不知何故该事件已从XAML代码中删除。。你上面的代码工作完美!!谢谢你的帮助!
var fullText = tbLog.Text;
if (e.Changes.Any())
{
    var additions = e.Changes.Where(tc => tc.AddedLength > 0);
    var newTexts = additions.Select(tc => fullText.Substring(tc.Offset, tc.AddedLength));

    // TODO: Do stuff with the new pieces of text
}
private void textTx1Asc_TextChanged(object sender, EventArgs e)
{                          
    string s;

    //get only the new chars
    s = textTx1Asc.Text;
    s = s.Remove(0, prev_len);          

    //update prev_len for next time
    prev_len = textTx1Asc.TextLength;

    //s contains only the new characters, process here                
}