如何找到使用 TextChanged 添加的文本

How do I find what text had been added with TextChanged

我希望在文本框中的文本和变量中的字符串之间进行同步。我找到了如何获取更改字符串的索引(在文本框中)、添加的长度和删除的长度,但我如何才能真正找到添加的字符串?

到目前为止,我已经使用了 TextChangedEventArgs.Changes,并获得了其中项目的属性 (ICollection)。

我正在尝试创建一个密码框,我可以在其中通过函数显示实际密码。因此我不希望文本框直接同步(例如,在文本框中会出现“*****”,在字符串 "hello")中。

如果您只想添加文本,您可以这样做

 string AddedText;
 private void textbox_TextChanged(object sender, TextChangedEventArgs e)
 {
     var changes = e.Changes.Last();
     if (changes.AddedLength > 0)
     {
         AddedText = textbox.Text.Substring(changes.Offset,changes.AddedLength);
     }
 }

编辑

如果您想要所有添加和删除的文本,您可以这样做

    string oldText;
    private void textbox_GotFocus(object sender, RoutedEventArgs e)
    {
        oldText = textbox.Text;
    }

    string AddedText;
    string RemovedText;
    private void textbox_TextChanged(object sender, TextChangedEventArgs e)
    {
        var changes = e.Changes.Last();
        if (changes.AddedLength > 0)
        {
            AddedText = textbox.Text.Substring(changes.Offset, changes.AddedLength);
            if (changes.RemovedLength == 0)
            {
                oldText = textbox.Text;
                RemovedText = "";
            }
        }
        if (changes.RemovedLength > 0)
        {
            RemovedText = oldText.Substring(changes.Offset, changes.RemovedLength);
            oldText = textbox.Text;
            if (changes.AddedLength == 0)
            {
                AddedText = "";
            }
        }
    }

DataBinding 是 WPF 中最常用的在 UI

中显示和收集数据的方法

试试这个:

<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Grid>
        <TextBox Text="{Binding Path=SomeText, UpdateSourceTrigger=PropertyChanged}"
                 HorizontalAlignment="Left"
                 Margin="101,83,0,0"
                 VerticalAlignment="Top"
                 Width="75" />
        <TextBlock Text="{Binding SomeText}"
                   HorizontalAlignment="Left"
                   Margin="101,140,0,0"
                   VerticalAlignment="Top"
                   Width="75" />
    </Grid>
</Window>

window 的代码:

public partial class MainWindow : Window
{
    private readonly AViewModel viewModel = new AViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }
}

保存您要显示和收集的数据的 ViewModel 的代码:

public class AViewModel : INotifyPropertyChanged
{
    private string someText;

    public string SomeText
    {
        get
        {
            return someText;
        }
        set
        {
            if (Equals(this.someText, value))
            {
                return;
            }
            this.someText = value;
            this.OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(
        [CallerMemberName]string propertyName = null)
    {
        this.PropertyChanged?.Invoke(
            this,
            new PropertyChangedEventArgs(propertyName));
    }
}

虽然这对于一个简单的场景来说看起来很复杂,但它有很多优点:

  • 您可以为 ViewModel 编写自动化(单元)测试,而无需创建 UI
  • 添加额外的字段和逻辑是微不足道的
  • 如果 UI 需要改变,ViewModel 并不总是需要改变

该机制的核心是Xaml中的{Binding ...}位,它告诉WPF在TextBox的Text属性和SomeText属性之间同步数据] 分配给 DataContext 的对象。 其他重要位是: - 在 window 的构造函数中设置 DataContext 和 - 在 ViewModel 中,当 SomeText 属性 更改时引发 PropertyChanged 事件,以便通知绑定。

请注意,这只是 DataBinding 的一个基本示例,可以在此代码中进行许多改进。