8

我正在尝试在 Windows 8 磁贴应用程序中找到一个很好的替代 Numericbox 的方法。我尝试使用与 Windows 窗体相同的数字框,但收到错误消息,提示 Windows 8 应用程序不支持这些数字框(?)。我注意到平铺应用程序的 TextBox 元素有一个可以设置为“数字”的 InputScope,但它仍然允许用户输入他想要输入的任何字符。我假设 InputScope 没有做我认为它做的事情。

我目前正在使用文本框进行管理,但是因为我正在进行计算,所以当我想更新界面时,必须不断地将文本转换为十进制,然后再返回文本,此外还必须执行多项检查以确保用户这样做不输入非数字字符。这变得非常乏味并且非常熟悉 Windows 窗体,这似乎是朝着错误方向迈出的一步。我一定遗漏了一些明显的东西吗?

4

2 回答 2

3

我不熟悉NumericTextBox,但这是一个简单的 C#/XAML 实现,它只允许数字和十进制字符。

它所做的只是覆盖OnKeyDown事件;根据被按下的键,它允许或不允许事件到达基TextBox类。

我应该注意,此实现适用于 Windows 应用商店应用程序 - 我相信您的问题是关于该类型的应用程序,但我不是 100% 确定。

public class MyNumericTextBox : TextBox
{
    protected override void OnKeyDown(KeyRoutedEventArgs e)
    {
        HandleKey(e);

        if (!e.Handled)
            base.OnKeyDown(e);
    }

    bool _hasDecimal = false;
    private void HandleKey(KeyRoutedEventArgs e)
    {
        switch (e.Key)
        {
            // allow digits
            // TODO: keypad numeric digits here
            case Windows.System.VirtualKey.Number0:
            case Windows.System.VirtualKey.Number1:
            case Windows.System.VirtualKey.Number2:
            case Windows.System.VirtualKey.Number3:
            case Windows.System.VirtualKey.Number4:
            case Windows.System.VirtualKey.Number5:
            case Windows.System.VirtualKey.Number6:
            case Windows.System.VirtualKey.Number7:
            case Windows.System.VirtualKey.Number8:
            case Windows.System.VirtualKey.Number9:
                e.Handled = false;
                break;

            // only allow one decimal
            // TODO: handle deletion of decimal...
            case (Windows.System.VirtualKey)190:    // decimal (next to comma)
            case Windows.System.VirtualKey.Decimal: // decimal on key pad
                e.Handled = (_hasDecimal == true);
                _hasDecimal = true;
                break;

            // pass various control keys to base
            case Windows.System.VirtualKey.Up:
            case Windows.System.VirtualKey.Down:
            case Windows.System.VirtualKey.Left:
            case Windows.System.VirtualKey.Right:
            case Windows.System.VirtualKey.Delete:
            case Windows.System.VirtualKey.Back:
            case Windows.System.VirtualKey.Tab:
                e.Handled = false;
                break;

            default:
                // default is to not pass key to base
                e.Handled = true;
                break;
        }
    }
}

这是一些示例 XAML。请注意,它假定MyNumericTextBox位于项目名称空间中。

<StackPanel Background="Black">
    <!-- custom numeric textbox -->
    <local:MyNumericTextBox />
    <!-- normal textbox -->
    <TextBox />
</StackPanel>
于 2013-10-15T02:07:13.890 回答
0

WinRT XAML 工具包的 NumericUpDown 控件可能就是您要找的。

于 2013-10-18T19:02:32.640 回答