diff --git a/SpineViewer/Spine/SkinManager.cs b/SpineViewer/Spine/SkinManager.cs index f678b86..7ca9331 100644 --- a/SpineViewer/Spine/SkinManager.cs +++ b/SpineViewer/Spine/SkinManager.cs @@ -39,9 +39,8 @@ namespace SpineViewer.Spine /// 皮肤属性描述符, 实现对属性的读取和赋值 /// /// 关联的 Spine 对象 - public class SkinWrapperPropertyDescriptor(Spine spine, int i) : PropertyDescriptor($"Skin{i}", [new DisplayNameAttribute($"皮肤 {i}")]) + public class SkinWrapperPropertyDescriptor(int i) : PropertyDescriptor($"Skin{i}", [new DisplayNameAttribute($"皮肤 {i}")]) { - private readonly Spine spine = spine; private readonly int idx = i; public override Type ComponentType => typeof(SkinManager); @@ -54,14 +53,23 @@ namespace SpineViewer.Spine /// /// 得到一个 SkinWrapper, 允许用户查看或者修改具体的属性值, 这个地方决定了在面板上看到的是一个对象及其属性 /// - public override object? GetValue(object? component) => new SkinWrapper(spine, idx); + public override object? GetValue(object? component) + { + if (component is SkinManager manager) + return manager.GetSkinWrapper(idx); + return null; + } /// /// 允许通过字符串赋值修改该位置的皮肤 /// public override void SetValue(object? component, object? value) { - if (value is string s) spine.ReplaceSkin(idx, s); + if (component is SkinManager manager) + { + if (value is string s) + manager.Spine.ReplaceSkin(idx, s); // manager.SetSkinWrapper(idx, s); + } } } @@ -71,8 +79,10 @@ namespace SpineViewer.Spine /// 关联的 Spine 对象 public class SkinManager(Spine spine) : ICustomTypeDescriptor { - private readonly Dictionary pdCache = []; + private static readonly Dictionary pdCache = []; + public Spine Spine { get; } = spine; + private readonly Dictionary skinWrapperProperties = []; // XXX: 必须实现 ICustomTypeDescriptor 接口, 不能继承 CustomTypeDescriptor, 似乎继承下来的东西会有问题, 导致某些调用不正确 @@ -93,12 +103,22 @@ namespace SpineViewer.Spine for (var i = 0; i < Spine.GetLoadedSkins().Length; i++) { if (!pdCache.ContainsKey(i)) - pdCache[i] = new SkinWrapperPropertyDescriptor(Spine, i); + pdCache[i] = new SkinWrapperPropertyDescriptor(i); props.Add(pdCache[i]); } return new PropertyDescriptorCollection(props.ToArray()); } + /// + /// 访问 SkinWrapper 属性 SkinManager.Skin{i} + /// + public SkinWrapper GetSkinWrapper(int i) + { + if (!skinWrapperProperties.ContainsKey(i)) + skinWrapperProperties[i] = new SkinWrapper(Spine, i); + return skinWrapperProperties[i]; + } + /// /// 在属性面板悬停可以显示已加载的皮肤列表 ///