如何优雅的为文本框添加清除按钮
ElementHelper
作 者:WPFDevelopersOrg - 驚鏵
原文链接[1]:https://github.com/WPFDevelopersOrg/WPFDevelopers
码云链接[2]:https://gitee.com/WPFDevelopersOrg/WPFDevelopers
框架支持.NET4 至 .NET8;Visual Studio 2022;如何优雅的为文本框添加清除按钮?
答:一般情况都会选择自定义控件,这样的话不清真,所以我们通过附加属性,可以让你的文本框变得更简洁。
新建一个 ElementHelper 辅助类
附加属性定义:
代码语言:javascript复制 public static readonly DependencyProperty IsClearProperty =
DependencyProperty.RegisterAttached("IsClear", typeof(bool), typeof(ElementHelper),
new PropertyMetadata(false, OnIsClearChanged));
定义IsClearProperty 附加属性默认是 false。
附加属性变更处理:
代码语言:javascript复制 private static void OnIsClearChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var button = d as Button;
if (button != null)
{
if ((bool)e.NewValue)
button.Click += ButtonClear_Click;
else
button.Click -= ButtonClear_Click;
}
}
OnIsClearChanged 当 IsClear 属性的值发生变化,调用这个方法。
当 IsClear 属性的值为 true,则监听按钮的 Click 事件;如果为 false,移除监听事件。
按钮点击事件处理:
代码语言:javascript复制private static void ButtonClear_Click(object sender, RoutedEventArgs e)
{
if (sender is Button button)
{
if (button.TemplatedParent is TextBox textBox)
{
textBox.Clear();
}
}
}
当按钮被点击时,它检查按钮的模板父级是否是一个 TextBox 。
如果是,则调用 Clear() 方法来清除文本框的内容。
1)ElementHelper.cs 代码如下:
代码语言:javascript复制public class ElementHelper : DependencyObject
{
public static readonly DependencyProperty IsClearProperty =
DependencyProperty.RegisterAttached("IsClear", typeof(bool), typeof(ElementHelper),
new PropertyMetadata(false, OnIsClearChanged));
public static void SetIsClear(UIElement element, bool value)
{
element.SetValue(IsClearProperty, value);
}
public static bool GetIsClear(UIElement element)
{
return (bool)element.GetValue(IsClearProperty);
}
private static void OnIsClearChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var button = d as Button;
if (button != null)
{
if ((bool)e.NewValue)
button.Click += ButtonClear_Click;
else
button.Click -= ButtonClear_Click;
}
}
private static void ButtonClear_Click(object sender, RoutedEventArgs e)
{
if (sender is Button button)
{
if (button.TemplatedParent is TextBox textBox)
{
textBox.Clear();
}
}
}
}
2)TextBoxStyle.xaml 代码如下:
附件属性 helpers:ElementHelper.IsClear 值为 True 并 Text 值为 {x:Null} 则显示清除按钮。
附件属性 helpers:ElementHelper.IsClear 值为 True 并 Text 值为空字符串 ""则显示清除按钮。
代码语言:javascript复制 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:WPFDevelopers.Controls" xmlns:helpers="clr-namespace:WPFDevelopers.Helpers" xmlns:resx="clr-namespace:WPFDevelopers">
当你已经成功实现了自定义的 Textbox 控件后,实现 PasswordBox 控件也可以按照类似的方法。文中 XAML 中使用 WPFDevelopers 库,如果直接拷贝使用,需要确保将相关的资源和控件进行正确的替换和配置。
如果你对此有任何更好的想法或建议,我们将非常感激并乐于听取。
参考资料
[1]
原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers
[2]
码云链接: https://gitee.com/WPFDevelopersOrg/WPFDevelopers