【问题标题】:Cancelling a WPF TextBox Changed Event取消 WPF 文本框更改事件
【发布时间】:2008-12-02 19:27:11
【问题描述】:

我正在学习来自 WinForms 开发的 WPF。

我有一个 TextChanged 事件分配给我的 WPF 应用程序中的一个 TextBox。如果用户输入了无效数据,我希望能够恢复到之前的文本值。

在旧形式的日子里,我会用 OldValue 替换 NewValue,但 WPF 的工作方式似乎不一样。

有什么想法可以做到这一点吗?我只是还没有考虑 WPF 吗?

谢谢。

【问题讨论】:

    标签: c# .net wpf textbox


    【解决方案1】:

    您可以通过两种方式做到这一点:

    1. 监听PreviewTextInput 事件并设置e.Handled = true 以停止TextChanged 事件。

    2. 使用 WPF 验证。有一个great post by Paul Stovell on Codeproject 和一个recent post on his blog

    这些文章将帮助您入门。我第一次进行验证时遇到的一件事是验证规则仅在绑定更新源时运行。

    【讨论】:

    • 它的 PreviewTextInput 不是 PreviewTextChanged !
    • 如果用户将一些文本粘贴到文本框中,PreviewTextInput 不会触发。
    • 这不适用于粘贴到TextBox,因为Text 属性是直接设置的;如果您想防止此类事件,您可能需要为 ApplicationCommands.Paste 添加一个处理程序。
    【解决方案2】:

    我会使用 PreviewTextInput,WPF 中的大多数事件都有一个 Preview 兄弟。如果您设置 e.Handled = true 它将阻止事件进一步冒泡/隧道。

    我不确定您是否知道,但据说预览事件是隧道式的,即。它们从最外面的容器开始,并发布在每个容器中,直到它到达具有焦点的控件。非预览事件被称为冒泡,即。它们从具有焦点的控件开始,并发布到每个父控件。

    如果您在最外层网格的 PreviewTextChanged 事件上设置 e.Handled = true,则您也会取消所有其他事件,包括 TextChanged。首先,所有预览事件从最外层触发到具有焦点的控件,然后所有非预览事件从具有焦点的控件触发,并发送到最外层的父控件。

    【讨论】:

    • PreviewTextChanged 在哪里?我只能找到 PreviewTextInput 和 TextChanged
    • 我不确定它是否被重命名或者我在第一种情况下错了,但正确的事件是 PreviewTextInput。
    • 编辑了状态 PreviewTextInput 的原始答案,而不是 PreviewTextChanged
    • 我怀疑它是否可以在 WPF 中进行更改,也许我们都在考虑 WinForms 事件。我只需要将我的答案更新为PreviewTextChanged
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 2014-05-19
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多