WinForms自定义TabPage:属性变更时如何刷新标签文本?
WinForms自定义TabPage:属性变更时如何刷新标签文本?
嗨,我来帮你搞定这个问题!你遇到的其实是WinForms里TabControl的一个常见小细节——你调用的Refresh()方法只会刷新TabPage内部的内容区域,不会触发TabControl重新绘制顶部的标签栏。咱们一步步来修正:
问题根源
你重写了Text属性,让它根据IsDirty状态返回带*的文本,但WinForms的TabControl并不会自动监测到这个“逻辑上的文本变化”。因为TabControl依赖TextChanged事件来知道标签文本需要更新,而你之前的代码没有触发这个事件,所以就算IsDirty变了,TabControl也不知道要重新读取Text属性并绘制标签。
解决方案:触发TextChanged事件
只需要修改NewTabPage类,在IsDirty和Text的setter里触发TextChanged事件,通知TabControl更新标签:
public class NewTabPage : TabPage { private bool _isDirty; private string _originalText; public bool IsDirty { get => _isDirty; set { if (_isDirty != value) { _isDirty = value; // 触发TextChanged事件,告诉TabControl标签文本变了 OnTextChanged(EventArgs.Empty); } } } public override string Text { get => _isDirty ? $"* {_originalText}" : _originalText; set { if (_originalText != value) { _originalText = value; // 原始文本修改时也触发事件,保证正常更新 OnTextChanged(EventArgs.Empty); } } } public NewTabPage(string text) { _isDirty = false; _originalText = text; } }
为什么这样有效?
OnTextChanged是TabPage基类的受保护方法,调用它会触发公开的TextChanged事件,而TabControl默认监听这个事件。- 当事件触发时,TabControl会重新获取当前TabPage的
Text属性值,然后重新绘制对应的标签,这样带*的文本就会显示出来了。 - 另外我把
_text改名为_originalText,是为了和重写的Text属性区分开,代码可读性更好。
现在你再测试一下:在UserControl的文本框输入内容后,TabPage的IsDirty设为true,触发TextChanged事件,TabControl就会自动更新标签,显示带*的文本啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

