UWP Community Toolkit имеет несколько очень хороших элементов управления, которые легко интегрировать, и одним из них является TextBox Mask , который идеально подходит для вашего сценария.
Вы также можете попробовать элемент управления TextBoxRegex , который не является тихим, что вы хотите, но на самом деле это то, что вы должны проверить, прежде чем продолжить.
Пожалуйста, обратитесь, если вывозникают трудности с интеграцией элемента управления для ваших конкретных требований.
При желании вы можете загрузить образец приложения для набора инструментов UWP, чтобы узнать обо всех доступных элементах управления / инструментах.( Пример приложения UWP Community Toolkit )
РЕДАКТИРОВАТЬ 1: Как вы могли заметить, поведение по умолчанию для tab состоит в том, что оно устанавливает фокус на следующий элемент управления.Таким образом, использование одного элемента управления не будет идеальным, поскольку при нажатии 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
}
}
То же самое относится к минутам и секундам ... просто в этих случаях регулярное выражение будет другим.