WPF:修剪所有文本框

本文关键字:文本 修剪 WPF | 更新日期: 2023-09-27 18:24:01

我最近收到一个要求,即我的应用程序中的所有文本框在离开文本框时都应该自动修剪文本。我不能/不想通过向每个文本框添加转换器或事件,或者通过在视图模型中为每个绑定编写/重写属性来实现这一点。首先,它会非常混乱和重复,其次,我的许多文本框都已经有了转换器,而且,如果不编写多个转换器,就无法连接多个转换器。

由于不能在每个关键点笔划处应用修剪,因此修剪必须在取消焦点事件之后,但在对视图模型进行绑定操作之前进行。

做这件事最好的方法是什么?写我自己的文本框类?某种控制模板/触发器?我对这些选项不够熟悉,不知道哪条路最容易。

我已经在App.xaml中为我所有的文本框设置了一个样式,当IsReadOnly设置为true时,它们看起来像IsEnabled=false,所以这可能会使事情变得复杂。

WPF:修剪所有文本框

好的,所以我有一个很好的解决方案,这是我非常简单的解决方案:

我添加了自己的控件,它继承自TextBox,TrimmedTextBox。施工单位:

public TrimmedTextBox()
{
    InitializeComponent();
    LostFocus += TrimmedTextBox_LostFocus;
}
private void TrimmedTextBox_LostFocus(object sender, RoutedEventArgs e)
{
    Text = Text.Trim();
}

这是在绑定完成它的工作之前触发的,所以保存到我的属性中的实际上是修剪后的值。

当然,我还必须在TargetType=TextBox的所有样式中添加修改。

MVVM的方式将使用行为

using System.Windows.Controls;
using System.Windows.Interactivity;
public class TrimTextBoxBehavior : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.LostFocus += AssociatedObject_LostFocus;
    }
    private void AssociatedObject_LostFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        AssociatedObject.Text = AssociatedObject.Text.Trim();
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.LostFocus -= AssociatedObject_LostFocus;
    }
}

然后在XAML中:

<UserControl ...
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:local="clr-namespace:Your.Namespace;assembly=Your.Assembly">
    <TextBox>
        <i:Interaction.Behaviors>
            <local:TrimTextBoxBehavior />
        </i:Interaction.Behaviors>
    </TextBox>

请注意,需要替换local XML命名空间声明中的Your.NamespaceYour.Assembly。此外,您还需要将System.Windows.Interactivy添加到项目中。