2015-09-19 37 views
1

假设我们继承WPF TextBox,然后尝试通过覆盖OnTextChanged来获取文本更改。如何查找WPF文本框的更改文本?

然后改变发生时,我们会发现,但是,我们将拥有的唯一信息是:

  • 偏移发生这种变化
  • 删除长度
  • 增加的长度

灿我们通过使用准确添加的文字,

Text.Substring(Change.Offset, Change.AddedLength) 

in OnTextChanged

文本更改发生在不同的条件下(如用户输入,粘贴文本或设置Text属性代码)。 e.Changes是否有可能发生冲突变更?

这种方法是一种信任方式吗?如果答案为否,是否有任何其他标准方式获得准确更改的文本?

回答

0

对于TextBox,当其文本更改时发生此事件;对于RichTextBox,当任何内容或格式更改(例如,图像,表格或背景颜色)时,会发生此事件。

  1. 我们可以通过使用...获得准确的添加文本吗?

是的,您将始终在TextBox的情况下获得准确的文本。您可以使用e.UndoAction来检查文本的添加/删除。 阅读documentation在这里。

  1. e.Changes是否有任何可能发生冲突的变化?

不会有冲突的变化。

一般来说,以下将永远是正确的:

  • 文档中的一个有效的状态中发生的结果的变化。 收集是连续排序的,与控件中发生更改的位置相关。例如,它表示在位置2的变化的TextChange对象 是TextChange 对象,它表示在位置10

  • 两个TextChange对象不表示重叠的面积的变化之前。偏移量的值加上一个TextChange对象的AddedLength的值始终小于或等于集合中的下一个TextChange对象的偏移值。同样,值为
    偏移加上一个TextChange对象的RemovedLength的值为
    总是小于或等于集合中下一个的TextChange对象的偏移值。

  • 收集反映了发生的任何变化,即使似乎没有净变化。在前面的示例中,第一次或第四次更改都不会导致净更改,因为每个简单的
    和 都分别被删除并重新添加了符号。但
    的符号实际上被删除和添加,因此它们被包含在
    的集合中。

更可以读here

0

我用一个TextBox和一个标签制作了一个简短的测试程序,我找不到你描述的问题。如果我为TextBox实现TextChanged事件(如下所示),即使我粘贴了一些东西,它也可以工作。检查null是需要的,因为如果Textbox具有初始值,则Initilialize方法将在创建标签之前触发更改事件。

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox tbSource = (sender as TextBox); 

     if (lblOutput == null) 
      return; 

     lblOutput.Content = tbSource.Text; 

    }