From 1453dc6634aa6da25c0deaeffc4a4a869f6e321a Mon Sep 17 00:00:00 2001
From: LiRuoChen <571244399@qq.com>
Date: Tue, 4 Aug 2026 15:18:27 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A2=84=E7=BB=91=E5=AE=9A?=
=?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BC=9A=E5=AF=BC=E8=87=B4=E6=A0=B7=E5=BC=8F?=
=?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2=E5=87=BA=E7=8E=B0=E9=80=92=E5=BD=92?=
=?UTF-8?q?=E6=AD=BB=E5=BE=AA=E7=8E=AF=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Rendering/Elements/StyleBoundElement.cs | 42 +++++++++++++------
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs b/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs
index 7455f31..8d5747a 100644
--- a/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs
+++ b/Runtime/XTable/Rendering/Elements/StyleBoundElement.cs
@@ -30,6 +30,9 @@ namespace XericUI.XTable.Rendering.Elements
/// 是否已绑定
private bool m_IsBound;
+ /// 是否正在注册字段,防止 StyleManager 同步回调导致重复注册。
+ private bool m_IsBinding;
+
/// 样式变更时触发(通知表格重绘)
public event System.Action OnStyleChangedCallback;
@@ -46,6 +49,7 @@ namespace XericUI.XTable.Rendering.Elements
///
public void Bind(string styleNamespace)
{
+ if (m_IsBinding && m_StyleNamespace == styleNamespace) return;
if (m_IsBound) Unbind();
m_StyleNamespace = styleNamespace;
@@ -56,19 +60,33 @@ namespace XericUI.XTable.Rendering.Elements
if (namespaces == null || !namespaces.Contains(styleNamespace))
return;
- // 预注册常用路径
- RegisterField("/cell/bg/color", OnStyleChanged);
- RegisterField("/cell/fg/color", OnStyleChanged);
- RegisterField("/cell/border/top/color", OnStyleChanged);
- RegisterField("/cell/border/bottom/color", OnStyleChanged);
- RegisterField("/cell/border/left/color", OnStyleChanged);
- RegisterField("/cell/border/right/color", OnStyleChanged);
- RegisterField("/cell/font/size", OnStyleChanged);
- RegisterField("/cell/font/alignment", OnStyleChanged);
- RegisterField("/cell/font/richText", OnStyleChanged);
-
+ // 先提交绑定状态。StyleField.Register 可能同步触发外部渲染;若此时仍显示未绑定,
+ // 同一对象会被再次 Bind 并重复注册,最终耗尽调用栈。
m_IsBound = true;
- RefreshAll();
+ m_IsBinding = true;
+ try
+ {
+ // 预注册常用路径
+ RegisterField("/cell/bg/color", OnStyleChanged);
+ RegisterField("/cell/fg/color", OnStyleChanged);
+ RegisterField("/cell/border/top/color", OnStyleChanged);
+ RegisterField("/cell/border/bottom/color", OnStyleChanged);
+ RegisterField("/cell/border/left/color", OnStyleChanged);
+ RegisterField("/cell/border/right/color", OnStyleChanged);
+ RegisterField("/cell/font/size", OnStyleChanged);
+ RegisterField("/cell/font/alignment", OnStyleChanged);
+ RegisterField("/cell/font/richText", OnStyleChanged);
+ RefreshAll();
+ }
+ catch
+ {
+ Unbind();
+ throw;
+ }
+ finally
+ {
+ m_IsBinding = false;
+ }
}
///