如何使用TextBoxExtensions.Mask实现WinUI3应用的IP地址输入限制?
WinUI 3 实现IP地址输入限制的可行方案
你用999.999.999.999作为Mask的问题在于,9代表必填数字,强制每个网段必须输入3位,不符合IP地址1-3位的输入需求。下面提供两种实用解决方法:
方法1:优化Mask+正则验证
利用Toolkit Mask语法中的#(可选数字)定义格式,再配合自定义验证规则确保每个网段在0-255范围内,同时规避前导零问题。
XAML代码
<TextBox controls:TextBoxExtensions.Mask="###.###.###.###" controls:TextBoxExtensions.MaskInputRejected="IpTextBox_MaskInputRejected"> <TextBox.Text> <Binding Path="IpAddress" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <local:IpValidationRule /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>
自定义验证规则(C#)
public class IpValidationRule : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var ipStr = value as string; if (string.IsNullOrWhiteSpace(ipStr)) return new ValidationResult(false, "IP地址不能为空"); // 正则匹配标准IPv4格式,同时验证网段范围0-255 var ipRegex = new Regex(@"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); if (!ipRegex.IsMatch(ipStr)) return new ValidationResult(false, "请输入有效的IPv4地址"); return ValidationResult.ValidResult; } }
输入拦截事件(可选)
处理不符合Mask规则的输入提示:
private void IpTextBox_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) { // 这里可添加错误提示,比如绑定到页面的提示文本框 }
方法2:自定义分段输入控件
如果需要更流畅的输入体验(比如自动跳转网段、实时限制数值范围),可以拆分4个独立输入框,精准控制每个网段的输入:
XAML代码
<UserControl> <StackPanel Orientation="Horizontal" VerticalAlignment="Center"> <TextBox x:Name="Seg1" Width="60" MaxLength="3" TextChanged="SegmentTextChanged"/> <TextBlock Text="." Margin="4,0"/> <TextBox x:Name="Seg2" Width="60" MaxLength="3" TextChanged="SegmentTextChanged"/> <TextBlock Text="." Margin="4,0"/> <TextBox x:Name="Seg3" Width="60" MaxLength="3" TextChanged="SegmentTextChanged"/> <TextBlock Text="." Margin="4,0"/> <TextBox x:Name="Seg4" Width="60" MaxLength="3"/> </StackPanel> </UserControl>
逻辑处理(C#)
private void SegmentTextChanged(object sender, TextChangedEventArgs e) { var textBox = sender as TextBox; if (textBox == null) return; // 过滤非数字字符 textBox.Text = new string(textBox.Text.Where(char.IsDigit).ToArray()); // 限制数值范围0-255 if (int.TryParse(textBox.Text, out int val) && val > 255) textBox.Text = "255"; // 输入满3位自动跳转到下一个网段 if (textBox.Text.Length == 3) { switch (textBox.Name) { case "Seg1": Seg2.Focus(FocusState.Programmatic); break; case "Seg2": Seg3.Focus(FocusState.Programmatic); break; case "Seg3": Seg4.Focus(FocusState.Programmatic); break; } } } // 对外暴露完整IP地址属性 public string FullIpAddress { get => $"{Seg1.Text}.{Seg2.Text}.{Seg3.Text}.{Seg4.Text}"; set { var segments = value.Split('.'); if (segments.Length == 4) { Seg1.Text = segments[0]; Seg2.Text = segments[1]; Seg3.Text = segments[2]; Seg4.Text = segments[3]; } } }
内容的提问来源于stack exchange,提问作者kinton
相关产品推荐
相关产品推荐

