You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:11:12