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

C# WinForm中Material Skin控件运行时变色及必填框高亮聚焦实现

解决Material Skin文本框未填时的红色高亮与聚焦问题

我之前也碰到过类似的需求,给你整理了一套可行的方案,亲测在Material Skin的WinForm项目里有效:

步骤1:标记必填文本框

首先,给需要校验的MaterialSingleLineTextField设置统一标识,比如用Tag属性标记为"Required",方便后续快速筛选:

// 在窗体构造函数或者Load事件里给必填框打标记
txtName.Tag = "Required";
txtPhone.Tag = "Required";
// 其他需要校验的文本框同理设置

步骤2:打印按钮的点击事件处理

在打印按钮的Click事件里,遍历所有必填文本框,检查内容并处理样式与聚焦逻辑:

private void btnPrint_Click(object sender, EventArgs e)
{
    bool hasEmptyRequired = false;
    MaterialSingleLineTextField firstEmptyField = null;

    // 遍历窗体上所有MaterialSingleLineTextField控件
    foreach (Control ctrl in this.Controls)
    {
        if (ctrl is MaterialSingleLineTextField txtField && txtField.Tag?.ToString() == "Required")
        {
            // 先清空之前的错误样式,避免重复触发时残留
            txtField.ForeColor = Color.Black;
            txtField.LineFocusColor = MaterialSkinManager.Instance.ColorScheme.AccentColor;
            txtField.LineIdleColor = MaterialSkinManager.Instance.ColorScheme.PrimaryColor;

            if (string.IsNullOrWhiteSpace(txtField.Text))
            {
                hasEmptyRequired = true;
                // 设置红色错误样式
                txtField.ForeColor = Color.Red;
                txtField.LineFocusColor = Color.Red;
                txtField.LineIdleColor = Color.Red;
                // 记录第一个空框,后续聚焦用
                if (firstEmptyField == null)
                {
                    firstEmptyField = txtField;
                }
            }
        }
    }

    // 存在未填项时阻止打印,提示并聚焦第一个空框
    if (hasEmptyRequired)
    {
        MessageBox.Show("请填写所有必填信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        firstEmptyField?.Focus();
        return;
    }

    // 这里放你的打印逻辑
    // 比如 PrintDocument.Print();
}

额外优化:输入时自动恢复样式

如果希望用户开始输入后自动恢复默认样式,可以给所有必填文本框绑定TextChanged事件:

private void RequiredTextField_TextChanged(object sender, EventArgs e)
{
    if (sender is MaterialSingleLineTextField txtField)
    {
        txtField.ForeColor = Color.Black;
        txtField.LineFocusColor = MaterialSkinManager.Instance.ColorScheme.AccentColor;
        txtField.LineIdleColor = MaterialSkinManager.Instance.ColorScheme.PrimaryColor;
    }
}

批量绑定事件的话,在设置Tag的时候一起加就行:

txtName.TextChanged += RequiredTextField_TextChanged;
txtPhone.TextChanged += RequiredTextField_TextChanged;

这样处理后,点击打印时所有未填的必填框会变成红色,第一个空框自动获得焦点,用户输入时样式也会自动恢复正常,完全符合你的需求~

内容的提问来源于stack exchange,提问作者Virell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:03:48