Wpf 如何查找添加了TextChanged的文本
我希望在文本框中的文本和变量中的字符串之间进行同步。我发现了如何获取文本框中字符串被更改的索引、添加的长度和删除的长度,但是我如何才能找到添加的字符串呢 到目前为止,我已经使用了textchangedventargs.Changes,并获得了ICollection中项目的属性Wpf 如何查找添加了TextChanged的文本,wpf,textbox,textchanged,Wpf,Textbox,Textchanged,我希望在文本框中的文本和变量中的字符串之间进行同步。我发现了如何获取文本框中字符串被更改的索引、添加的长度和删除的长度,但是我如何才能找到添加的字符串呢 到目前为止,我已经使用了textchangedventargs.Changes,并获得了ICollection中项目的属性 我正在尝试创建一个密码框,在其中我可以通过函数显示实际密码。因此,我不希望文本框直接同步,例如,在文本框中会出现****和字符串hello。如果只希望添加文本,可以这样做 string AddedText; priva
我正在尝试创建一个密码框,在其中我可以通过函数显示实际密码。因此,我不希望文本框直接同步,例如,在文本框中会出现****和字符串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 = "";
}
}
}
编辑
如果要添加和删除所有文本,可以执行此操作
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 = "";
}
}
}
数据绑定是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>
以及保存要显示和收集的数据的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属性和分配给DataContext的对象的SomeText属性之间同步数据。
其他有效位为:
-在窗口的构造函数中,DataContext和
-在ViewModel中,当SomeText属性更改时引发PropertyChanged事件,以便通知绑定
请注意,这只是数据绑定的一个基本示例,在这段代码中可以做很多改进。跟踪更改是重要的还是最终值重要?我建议在后者中使用数据绑定case@ErnodeWeerd你能解释一下吗?想想看,但是如果文本的变化在文本框的中间怎么办?我的意思是,改变不一定要在文本框的结尾,它只会给你增加文本的长度。如果一个字符被改变,而不是被添加或删除,它也会起作用