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; + } } ///