如何强制子类文本框的值?

时间:2010-11-11 14:32:25

标签: c# wpf numericupdown

我和很多人一样,需要在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事件可以让我在值发生变化之前对其进行操作,所以这是我最好的猜测。

这是对的吗?

1 个答案:

答案 0 :(得分:0)

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

Convert.ToInt32(e.Text);

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

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