如何找到TextChanged添加的文本

时间:2018-04-27 16:15:17

标签: wpf textbox textchanged

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

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

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

2 个答案:

答案 0 :(得分:1)

如果您只想添加文字,可以执行此操作

 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 = "";
            }
        }
    }

答案 1 :(得分:0)

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>

窗口代码:

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

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

  • 您可以在不创建UI的情况下为ViewModel编写自动(单元)测试
  • 添加额外的字段和逻辑很简单
  • 如果UI需要更改,ViewModel将不再需要更改

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

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