如何跟踪WPF中TextBox中的哪个字符被删除?

2023-11-23

我想跟踪用户通过Delete或BackSpace键删除了哪个字符。

我正在处理文本框的 TextBox_ChangedEvent。

我可以从中提取删除的字符吗文本更改事件参数 e.变更如果是的话我该怎么做?

我想限制用户从文本框中删除任何字符。我希望用户只能删除两个字符(比如说“(”或“)”)

请建议。


下面您将找到附加属性的代码,可以像这样使用它来防止从文本框删除除“(”或“)”之外的任何内容。

<TextBox my:TextBoxRestriction.RestrictDeleteTo="()" ... />

这将正确处理所有鼠标和键盘更新,例如:

  1. 选择多个字符时使用删除键
  2. 退格键的使用
  3. 使用 Ctrl-X 进行剪切
  4. 单击菜单栏上的“剪切”按钮

正因为如此,它比简单地拦截 PreviewKeyDown 功能要强大得多。

这还会通过直接分配给 .Text 属性来禁用通过“(”或“)”删除任何内容,因此这将失败:

textBox.Text = "Good morning";

因此,TextBoxRestriction 类还包含另一个附加属性,称为不受限制的文本设置后,可以绕过限制更新 Text 属性。这可以在代码中使用设置TextBoxRestriction.SetUnrestrictedText,或像这样的数据绑定:

<TextBox my:TextBoxRestriction.RestrictDeleteTo="()"
         my:TextBoxRestriction.UnrestrictedText="{Binding PropertyNameHere}" />

在下面的实现中,UnrestrictedText 仅在还设置了 RestrictDeleteTo 时才起作用。可以进行完整的实现,每当设置任一属性时就注册事件处理程序,并将处理程序保存在第三个附加属性中以供以后取消注册。但对于您当前的需求来说,这可能是不必要的。

这是承诺的实现:

public class TextBoxRestriction : DependencyObject
{
  // RestrictDeleteTo:  Set this to the characters that may be deleted
  public static string GetRestrictDeleteTo(DependencyObject obj) { return (string)obj.GetValue(RestrictDeleteToProperty); }
  public static void SetRestrictDeleteTo(DependencyObject obj, string value) { obj.SetValue(RestrictDeleteToProperty, value); }
  public static readonly DependencyProperty RestrictDeleteToProperty = DependencyProperty.RegisterAttached("RestrictDeleteTo", typeof(string), typeof(TextBoxRestriction), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
      {
        var box = (TextBox)obj;
        box.TextChanged += (obj2, changeEvent) =>
          {
            var oldText = GetUnrestrictedText(box);
            var allowedChars = GetRestrictDeleteTo(box);
            if(box.Text==oldText || allowdChars==null) return;

            foreach(var change in changeEvent.Changes)
              if(change.RemovedLength>0)
              {
                string deleted = box.Text.Substring(change.Offset, change.RemovedLength);
                if(deleted.Any(ch => !allowedChars.Contains(ch)))
                  box.Text = oldText;
              }
            SetUnrestrictedText(box, box.Text);
          };
      }
  });

  // UnrestrictedText:  Bind or access this property to update the Text property bypassing all restrictions
  public static string GetUnrestrictedText(DependencyObject obj) { return (string)obj.GetValue(UnrestrictedTextProperty); }
  public static void SetUnrestrictedText(DependencyObject obj, string value) { obj.SetValue(UnrestrictedTextProperty, value); }
  public static readonly DependencyProperty UnrestrictedTextProperty = DependencyProperty.RegisterAttached("UnrestrictedText", typeof(string), typeof(TextBoxRestriction), new PropertyMetadata
  {
    DefaultValue = "",
    PropertyChangedCallback = (obj, e) =>
      {
        var box = (TextBox)obj;
        box.Text = (string)e.NewValue;
      }
  });

}

工作原理:当您设置 UnrestrictedText 时,它会设置 Text,反之亦然。 TextChanged 处理程序检查 Text 是否与 UnrestrictedText 不同。如果是这样,它就知道文本已通过设置 UnrestrictedText 之外的某种其他机制进行了更新,因此会扫描更改以查找非法删除。如果找到,它将 Text 设置回仍存储在 UnrestrictedText 中的值,从而阻止更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跟踪WPF中TextBox中的哪个字符被删除? 的相关文章

随机推荐

  • 未捕获的类型错误:无法添加属性 12,对象不可扩展

    我似乎无法理解我在客户端应用程序上遇到的错误 我正在订阅 graphql 订阅 并且能够检索更新 但无法将更改推送到绑定到视图的名为 models ModelClass 的打字稿数组 我是否遗漏或做错了什么 模型 组件 ts this ap
  • PHP Zend Framework - 如何从请求对象获取请求 URI 片段?

    比如说我有一个 URIhttp 127 0 0 1 somecontroller someaction 12345这带我去someAction someController 控制器的操作 从那里 我可以通过检索请求对象 this gt ge
  • 制作多语言网站的最佳方式

    我用 ASP NET C 及其内容English 现在我需要以支持多种语言的方式制作这个网站 即 德语 法语 标签 文本框 字符串所有值将显示各自选定的语言 在搜索时我发现有一些方法 比如 使用本地化 使用资源文件 数据库 不同语言的所有内
  • p:fileUpload 中的侦听器方法永远不会在 primefaces 中调用 [重复]

    这个问题在这里已经有答案了 我正在尝试上传带有 primefaces 的图像 但未调用 fileUploadListener
  • 服务中的重定向 - symfony2

    我可以重定向到服务中的另一个控制器吗 我已经根据提供的示例实现了一项服务 阿塔米尔 我的由控制器执行的函数代码如下所示 public function verifyanddispatch session this gt request gt
  • 使用ajax和jquery替换div内容

    我尝试使用以下代码来替换 div 内容 但它不起作用 我做错了什么 function MakeRequest page num li click function var id this id alert id ajax url displ
  • 如何从 div 外部的链接使用 jQuery UI 选项卡打开选项卡?

    这可能有点难以解释 但我会尽力 我有一个产品页面 有两个选项卡 完整说明和视频 这些是使用 jQuery UI 选项卡完成的 在页面的这一部分上方 我有一个带有缩略图的产品图像 但我希望其中一个缩略图成为查看视频的链接 当然 该链接包含在视
  • 删除 MATLAB 中的空单元格

    我想删除 matlab 元胞数组底部的所有空元胞 然而 我发现的所有代码示例都将矩阵折叠为向量 这不是我想要的 所以这段代码 a 1 2 3 4 emptyCells cellfun isempty a a emptyCells 结果在这个
  • Swift:如何检测 UISplitViewController 当前是否显示 1 个或 2 个控制器?

    我如何检测是否UISplitViewController目前刚刚展示1 个视图控制器或者它在双窗格中2 个视图控制器并排显示 分割视图控制器反映了实际的显示模式显示模式财产 全部可见 主 UIViewController 和辅助 UIVie
  • 我需要显式分配我的 NSNumber 吗?

    我定义一个数字 如下 NSNumber nn0 NSNumber numberWithInt 0 无需任何分配即可正常工作 我的理解是 如果我使用 numberWithInt 则会自动调用 alloc 和 init 如果我尝试在函数结束时释
  • 基于自定义 HTTP 标头的 UrlRewrite 条件

    我正在尝试在 UrlRewrite 中配置一个有 2 个条件的规则 HTTP 标头HTTP HOST需要匹配某个域 api contoso com 自定义 HTTP 标头x app version需要出现在 HTTP 请求中 根据此信息 我
  • 如何将鼠标滚轮输入定向到光标下方进行控制而不是聚焦?

    我使用了许多滚动控件 TTreeViews TListViews DevExpress cxGrids 和 cxTreeLists 等 当鼠标滚轮旋转时 无论鼠标光标位于哪个控件上 具有焦点的控件都会接收输入 如何将鼠标滚轮输入定向到鼠标光
  • 如何使用 SWIG 从 C++ 调用 Java?

    我可以使用 SWIG 从 Java 调用 C 代码 但我找不到任何有关如何执行相反操作 从 C 调用 Java 的文档 官方 SWIG 文档说 http www swig org Doc1 3 Java html java overview
  • Laravel eloquent 模型模型属性转换(我应该转换哪些属性类型?)

    我不确定我是否完全理解 Laravel Eloquent 属性转换 根据文件 https laravel com docs 8 x eloquent mutators attribute casting 这些是支持的类型 整数 实数 浮点
  • MATLAB 支持前向声明吗?

    是否可以在 m 文件中使用函数 该函数在同一文件的后面部分中实现 以与其他编程语言 例如 C 类似的风格 当然 在这样的 m 文件中 局部函数将在主函数之后声明 例如 function y main func x This is the m
  • 加速熊猫 cummin/cummax

    Pandas cummin and cummax对于我的许多组的用例来说 函数似乎真的很慢 我怎样才能加快他们的速度 Update import pandas as pd import numpy as np from collection
  • 折线图中的条件背景颜色

    我目前正在尝试将我们的图表从 PQ Systems Chartrunner 转换为 SSRS 2008 图表 我目前正在 SSRS 2008 中使用折线图 并尝试让背景颜色针对不同的西格玛进行更改 我能够计算并绘制标准差西格玛线 但我无法更
  • 如何检索 COM 类的接口 ID,以便将其传递给 CoCreateInstance?

    我想以编程方式检索任何类的接口 ID 以便可以将其传递给 CoCreateInstance 很感谢任何形式的帮助 请参阅下面的 如何获取此内容 HRESULT hResult CLSID ClassID void pInterface if
  • 转储到 JSON 添加了额外的双引号和引号转义

    我正在使用 Python 工具检索 Twitter 数据 并将这些数据以 JSON 格式转储到我的磁盘上 我注意到用双引号括起来的推文的整个数据字符串被意外转义 此外 实际 JSON 格式的所有双引号都用反斜杠转义 它们看起来像这样 cre
  • 如何跟踪WPF中TextBox中的哪个字符被删除?

    我想跟踪用户通过Delete或BackSpace键删除了哪个字符 我正在处理文本框的 TextBox ChangedEvent 我可以从中提取删除的字符吗文本更改事件参数 e 变更如果是的话我该怎么做 我想限制用户从文本框中删除任何字符 我