0

我和很多人一样,需要在 WPF 中创建一个数字文本框控件。到目前为止,我已经取得了很好的进展,但我不确定下一步的正确方法是什么。

作为控件规范的一部分,它必须始终显示一个数字。如果用户突出显示所有文本并点击退格或删除,我需要确保该值设置为零,而不是“空白”。我应该如何在 WPF 控制模型中做到这一点?

到目前为止我所拥有的(缩写):

public class PositiveIntegerTextBox : TextBox
{
    protected override void OnPreviewTextInput(System.Windows.Input.TextCompositionEventArgs e)
    {
        // Ensure typed characters are numeric
    }

    protected override void OnPreviewDrop(DragEventArgs e)
    {
        // Ensure the dropped text is numeric.
    }

    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        if (this.Text == string.Empty)
        {
            this.Text = "0";
            // Setting the Text will fire OnTextChanged again--
            // Set Handled so all the other handlers only get called once.
            e.Handled = true; 
        }

        base.OnTextChanged(e);
    }

    private void HandlePreviewExecutedHandler(object sender, ExecutedRoutedEventArgs e)
    {
        // If something's being pasted, make sure it's numeric
    }
}

一方面,这很简单,似乎工作正常。我不确定它是否正确,因为我们总是(如果非常简单的话)将文本设置为空白,然后再将其重置为零。但是,没有 PreviewTextChanged 事件可以让我在值更改之前对其进行操作,所以这是我最好的猜测。

这是对的吗?

4

1 回答 1

0

为什么不简单地使用您的OnPreviewTextInput处理程序来检查传入的值是否为 int,尝试将其转换...

Convert.ToInt32(e.Text);

如果转换失败,则它不是 int,因此将其标记为已处理,因此文本不会更改。

虽然这可能会稍微违反您的需要,即...删除所有文本不会恢复为 0,但它仍然是一个 int。我个人认为从 UI 的角度来看这更合乎逻辑,因为为什么清除所有输入会将值移动到 0?这本身就将 定义TextBox为接受非 int 值,因为 UI 在这些条件下会发生变化。

于 2010-11-11T14:45:53.323 回答