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
相关产品推荐
相关产品推荐

