diff --git a/SpineViewer/Exporter/Implementations/ExportArgs/FrameSequenceExportArgs.cs b/SpineViewer/Exporter/Implementations/ExportArgs/FrameSequenceExportArgs.cs index 8f7208c..2d3a3c4 100644 --- a/SpineViewer/Exporter/Implementations/ExportArgs/FrameSequenceExportArgs.cs +++ b/SpineViewer/Exporter/Implementations/ExportArgs/FrameSequenceExportArgs.cs @@ -19,7 +19,7 @@ namespace SpineViewer.Exporter.Implementations.ExportArgs /// /// 文件名后缀 /// - [TypeConverter(typeof(SFMLImageFileSuffixConverter))] + [TypeConverter(typeof(StringEnumConverter)), StringEnumConverter.StandardValues(".png", ".jpg", ".tga", ".bmp")] [Category("[2] 帧序列参数"), DisplayName("文件名后缀"), Description("帧文件的后缀,同时决定帧图像格式")] public string FileSuffix { get; set; } = ".png"; } diff --git a/SpineViewer/Exporter/TypeConverter.cs b/SpineViewer/Exporter/TypeConverter.cs index 7fe0bb5..d43dd67 100644 --- a/SpineViewer/Exporter/TypeConverter.cs +++ b/SpineViewer/Exporter/TypeConverter.cs @@ -10,20 +10,6 @@ using System.Threading.Tasks; namespace SpineViewer.Exporter { - public class SFMLImageFileSuffixConverter : StringConverter - { - private readonly string[] supportedFileSuffix = [".png", ".jpg", ".tga", ".bmp"]; - - public override bool GetStandardValuesSupported(ITypeDescriptorContext? context) => true; - - public override bool GetStandardValuesExclusive(ITypeDescriptorContext? context) => true; - - public override StandardValuesCollection? GetStandardValues(ITypeDescriptorContext? context) - { - return new StandardValuesCollection(supportedFileSuffix); - } - } - public class SFMLColorConverter : ExpandableObjectConverter { private class SFMLColorPropertyDescriptor : SimplePropertyDescriptor diff --git a/SpineViewer/TypeConverter.cs b/SpineViewer/TypeConverter.cs index 8f5e156..6d25d2a 100644 --- a/SpineViewer/TypeConverter.cs +++ b/SpineViewer/TypeConverter.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -45,4 +46,46 @@ namespace SpineViewer return base.ConvertFrom(context, culture, value); } } + + public class StringEnumConverter : StringConverter + { + /// + /// 字符串标准值列表属性 + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] + public class StandardValuesAttribute : Attribute + { + /// + /// 标准值列表 + /// + public ReadOnlyCollection StandardValues { get; private set; } + private readonly List standardValues = []; + + /// + /// 字符串标准值列表 + /// + /// 允许的字符串标准值 + public StandardValuesAttribute(params string[] values) + { + standardValues.AddRange(values); + StandardValues = standardValues.AsReadOnly(); + } + } + + public override bool GetStandardValuesSupported(ITypeDescriptorContext? context) => true; + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext? context) => true; + + public override StandardValuesCollection? GetStandardValues(ITypeDescriptorContext? context) + { + // 查找属性上的 StandardValuesAttribute + var attribute = context?.PropertyDescriptor?.Attributes.OfType().FirstOrDefault(); + StandardValuesCollection result; + if (attribute != null) + result = new StandardValuesCollection(attribute.StandardValues); + else + result = new StandardValuesCollection(Array.Empty()); + return result; + } + } }