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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:44:32