如何找到使用 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 的一个基本示例,可以在此代码中进行许多改进。
我希望在文本框中的文本和变量中的字符串之间进行同步。我找到了如何获取更改字符串的索引(在文本框中)、添加的长度和删除的长度,但我如何才能真正找到添加的字符串?
到目前为止,我已经使用了 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 的一个基本示例,可以在此代码中进行许多改进。