我想实现一些事情,当用户输入 4 个字符时,应该在文本中添加一个连字符,然后用户再次输入 4 个字符,然后再次在 WPF 中自动添加连字符。
笔记
“我想在用户输入文本框时实现这种行为(而不是在文本框失去焦点之后),因为后者很容易实现”
使用 MVVM 模型,因此 Dialog 后面的代码应该是空的
我想实现一些事情,当用户输入 4 个字符时,应该在文本中添加一个连字符,然后用户再次输入 4 个字符,然后再次在 WPF 中自动添加连字符。
笔记
“我想在用户输入文本框时实现这种行为(而不是在文本框失去焦点之后),因为后者很容易实现”
使用 MVVM 模型,因此 Dialog 后面的代码应该是空的
您可以使用视图模型中的属性来执行此操作,如下所示。但是,您会发现文本框插入符中的光标不会移动到最后一个索引,并且由于插入符索引不可绑定,您需要创建一个附加属性以绑定到索引。
private string _serial;
public string Serial
{
get { return _serial; }
set
{
if (_serial != value)
{
_serial = value;
int res = 0;
Math.DivRem(_serial.Length, 4, out res);
if (res == 0)
Serial = string.Format("{0}-", _serial);
CaretIndex = _serial.Lenght - 1;
RaisePropertyChanged("Serial");
}
}
}
这是您需要的 xaml 代码。
<Window x:Name="root" x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<TextBox
Text="{Binding ElementName=root, Path=Serial, UpdateSourceTrigger=PropertyChanged}"
local:TextIndexBinder.Index="{Binding ElementName=root, Path=Index}"
/>
</Window>
属性定义:
我们应该计算字符串中不包括连字符的字符 插入索引不能在这里设置,因为OnPropertyChanged
还没有被调用,所以TextBox.Text
stil 包含旧值,你不能设置一个大于文本长度的值:
private string _serial;
public string Serial
{
get { return _serial; }
set
{
if (_serial != value)
{
_serial = value;
int res = 0;
int hyphensCount = _serial.Count(c => c.Equals('-'));
Math.DivRem(_serial.Length - hyphensCount, 4, out res);
if (res == 0)
_serial = string.Format("{0}-", _serial);
OnPropertyChanged("Serial");
}
}
}
行为 -
注册到TextChanged
事件并将插入符号移到文本末尾:
public class MoveCaretToEndBehavior: Behavior<TextBox>
{
protected override void OnAttached()
{
AssociatedObject.TextChanged += new TextChangedEventHandler(AssociatedObject_TextChanged);
}
void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
{
AssociatedObject.CaretIndex = AssociatedObject.Text.Length;
}
}
文本框 + 行为
<TextBox Text="{Binding Serial,UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<local:MoveCaretToEndBehavior />
</i:Interaction.Behaviors>
</TextBox>