首页 > 解决方案 > UWP 的格式化文本框

问题描述

我想知道是否有人对如何为时间输入(hh:mm:ss)以及以度、分、秒(dd°mm'ss")为单位的坐标设置文本框格式有任何建议。我很清楚你可以通过 String.Format() 方法设置字符串的格式....这确实给了我在文本框中所需的布局,但我想要一个锁定了适当符号的控件,并将自动标记这些符号作为用户给出他们的输入。

我一直在寻找一种在 C#/UWP 中执行此操作的方法,但没有成功,如果有人有任何建议或可以指出我正确的方向,我将不胜感激。

标签: c#visual-studiouwp

解决方案


UWP Community Toolkit有一些非常好的控件,它们易于集成,其中之一是TextBox Mask控件,它非常适合您的场景。

您还可以尝试TextBoxRegex控件,它不是您想要的安静,但确实是您在继续之前应该检查的东西。

如果您在集成控件以满足您的特定要求时遇到困难,请与我们联系。


或者,您可以下载 UWP 工具包的示例应用程序,以了解所有可用的控件/工具。(UWP 社区工具包示例应用程序


编辑 1:您可能已经注意到,选项卡的默认行为是将焦点设置到下一个控件。因此,拥有单个控件并不理想,因为按下tab时,您的文本框将失去焦点,您需要更新文本并将焦点设置回文本框。

一种相对简单的方法如下:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" BorderThickness="1">
                <StackPanel.BorderBrush>
                    <SolidColorBrush Color="{ThemeResource SystemBaseHighColor}"/>
                </StackPanel.BorderBrush>
                <TextBox x:Name="hour" MaxLength="2" BorderBrush="{x:Null}" VerticalAlignment="Center" HorizontalAlignment="Center" LostFocus="hour_LostFocus"></TextBox>
                <TextBlock Text=":" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                <TextBox x:Name="minute" MaxLength="2" BorderBrush="{x:Null}" HorizontalAlignment="Center" VerticalAlignment="Center" LostFocus="minute_LostFocus"></TextBox>
                <TextBlock Text=":" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                <TextBox x:Name="second" MaxLength="2" BorderBrush="{x:Null}" HorizontalAlignment="Center" VerticalAlignment="Center" LostFocus="second_LostFocus"></TextBox>
</StackPanel>

自定义控件

这基本上是您的自定义构建控件/用户控件。这样当用户退出时,它会移动到堆栈面板内的下一个文本框,依此类推。

在您的hour_LostFocus事件中,您可以验证文本框的当前值并附加 0 并进行其他验证。

private void hour_LostFocus(object sender, RoutedEventArgs e)
{            
            string val = (sender as TextBox).Text;

            Regex regex = new Regex(@"^([0[0-9]|1[0-9]|2[0-3])$");
            Match match = regex.Match(val);

            if (!match.Success)
            {
                //append 0 and other validations
            }            

}

这同样适用于分钟和秒......只是在这些情况下正则表达式会有所不同。


推荐阅读