UWP 中有小时、分钟和秒的时间控制吗?
Any time control with hours, minutes and seconds in UWP?
我想要一个时间选择器控件,我可以在其中设置小时、分钟和秒。默认的时间选择器控件不包含秒。在时间选择器控件中获得秒值的最简单方法是什么?
内置TimePicker
确实不支持秒输入。您可以子类化 TimePicker
并手动扩展它以支持这种情况,但这可能非常复杂,因为您不仅必须修改控件本身的模板,而且还必须编辑 TimePickerFlyoutPresenter
支持秒输入。甚至可能根本不可能,而且可能有点矫枉过正。
我认为更好更简单的解决方案是使用 Windows 社区工具包 的一部分 TextBoxMask
extension。这允许您定义 TextBox
的自定义格式,它可能如下所示:
<TextBox extensions:TextBoxMask.CustomMask="5:[0-5]"
extensions:TextBoxMask.Mask="99:59:59" />
此 TextBox
将支持 hh:mm:ss
格式的输入。默认情况下,Mask
支持字符 a
用于字母,9
用于数字 0-9 和 *
用于任何字符。您可以使用 CustomMask
定义自定义掩码字符,这是我在这里所做的,以确保几十分钟和几秒钟限制在五十 (00-59)。
另一种解决方案可能是创建一个自定义控件,将普通的内置 TimePicker
与 TextBox
组合在一起仅需几秒钟,但我认为 TextBoxMask
更好,用户友好的解决方案。
(+ 1) 马丁·齐克蒙德
我只想改进一下 Martin Zikmund 的回答。
TextBox Mask property has 3 build in variable characters
'a' which represents [a-Z] '9' which represents [0-9] '*' which represents
a or 9
24 小时格式:
XAML
<TextBox ui:TextBoxExtensions.CustomMask="0:[0-2],1:[0-9],5:[0-5]"
ui:TextBoxExtensions.Mask="01:59:59" x:Name="tbTime" TextChanged="tbTime_TextChanged"/>
代码
private void tbTime_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = (TextBox)sender;
string textBoxText = textBox.Text;
if (IsValidTimeFormat(textBoxText))
{
// Yep
}
else
{
// Nope
}
}
// Check if the string is valid TimeSpan
public bool IsValidTimeFormat(string input)
{
TimeSpan dummyOutput;
return TimeSpan.TryParse(input, out dummyOutput);
}
ui:TextBoxExtensions.CustomMask="0:[0-2],1:[0-9],5:[0-5]"的解释
和 ui:TextBoxExtensions.Mask="01:59:59"
0:[0-2] 表示我们在任何地方插入 0(零)
ui:TextBoxExtensions.Mask="01:59:59" 允许输入数字0-2.
事实上,0 可以是任何字符或数字,因为它就像一个变量名。所以你可以输入 3:[0-2] 并在这里使用它 ui:TextBoxExtensions.Mask="31:59:59".
我想要一个时间选择器控件,我可以在其中设置小时、分钟和秒。默认的时间选择器控件不包含秒。在时间选择器控件中获得秒值的最简单方法是什么?
内置TimePicker
确实不支持秒输入。您可以子类化 TimePicker
并手动扩展它以支持这种情况,但这可能非常复杂,因为您不仅必须修改控件本身的模板,而且还必须编辑 TimePickerFlyoutPresenter
支持秒输入。甚至可能根本不可能,而且可能有点矫枉过正。
我认为更好更简单的解决方案是使用 Windows 社区工具包 的一部分 TextBoxMask
extension。这允许您定义 TextBox
的自定义格式,它可能如下所示:
<TextBox extensions:TextBoxMask.CustomMask="5:[0-5]"
extensions:TextBoxMask.Mask="99:59:59" />
此 TextBox
将支持 hh:mm:ss
格式的输入。默认情况下,Mask
支持字符 a
用于字母,9
用于数字 0-9 和 *
用于任何字符。您可以使用 CustomMask
定义自定义掩码字符,这是我在这里所做的,以确保几十分钟和几秒钟限制在五十 (00-59)。
另一种解决方案可能是创建一个自定义控件,将普通的内置 TimePicker
与 TextBox
组合在一起仅需几秒钟,但我认为 TextBoxMask
更好,用户友好的解决方案。
(+ 1) 马丁·齐克蒙德
我只想改进一下 Martin Zikmund 的回答。
TextBox Mask property has 3 build in variable characters
'a' which represents [a-Z] '9' which represents [0-9] '*' which represents a or 9
24 小时格式:
XAML
<TextBox ui:TextBoxExtensions.CustomMask="0:[0-2],1:[0-9],5:[0-5]"
ui:TextBoxExtensions.Mask="01:59:59" x:Name="tbTime" TextChanged="tbTime_TextChanged"/>
代码
private void tbTime_TextChanged(object sender, TextChangedEventArgs e)
{
var textBox = (TextBox)sender;
string textBoxText = textBox.Text;
if (IsValidTimeFormat(textBoxText))
{
// Yep
}
else
{
// Nope
}
}
// Check if the string is valid TimeSpan
public bool IsValidTimeFormat(string input)
{
TimeSpan dummyOutput;
return TimeSpan.TryParse(input, out dummyOutput);
}
ui:TextBoxExtensions.CustomMask="0:[0-2],1:[0-9],5:[0-5]"的解释 和 ui:TextBoxExtensions.Mask="01:59:59"
0:[0-2] 表示我们在任何地方插入 0(零) ui:TextBoxExtensions.Mask="01:59:59" 允许输入数字0-2.
事实上,0 可以是任何字符或数字,因为它就像一个变量名。所以你可以输入 3:[0-2] 并在这里使用它 ui:TextBoxExtensions.Mask="31:59:59".