Вместо того, чтобы сериализовать ваши кнопки в файле ресурсов, вы можете попытаться сериализовать их в код позади.Для этого вам нужно реализовать пользовательский TypeDescriptor
для вашего типа CompactButton
и обработать преобразование в InstanceDescriptor
.Посмотрите на Как реализовать TypeConverter .Пример:
[TypeConverter(typeof(CompactButtonTypeConverter))]
public class CompactButton: ... {
...
}
public class CompactButtonTypeConverter: TypeConverter {
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
if (destinationType == typeof(InstanceDescriptor))
return true;
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(InstanceDescriptor) && value is CompactButton) {
// This assumes you have a public default constructor on your type.
ConstructorInfo ctor = typeof(CompactButton).GetConstructor();
if (ctor != null)
return new InstanceDescriptor(ctor, new object[0], false);
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
Для получения дополнительной информации см. Также класс InstanceDescriptor .
UPDATE : что касается вашего UITypeEditor
и свойства CompactButtonsВам не нужен сеттер.Измените свойство CompactButtons следующим образом:
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Editor(typeof(ButtonPanelXEditor), typeof(UITypeEditor))]
public List<CompactButton> CompactButtons
{
get { return _compactButtons; } // _compactButtons must of course be initialized.
}
Тогда вы можете реализовать метод EditValue UITypeEditor
примерно так:
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context,
IServiceProvider provider, object value) {
if (context == null || provider == null)
return null;
var b = context.Instance as ButtonPanel;
if (b == null)
return value;
var editorService = (IWindowsFormsEditorService)
provider.GetService(typeof(IWindowsFormsEditorService));
if (editorService == null)
return null;
// This constructor should copy the buttons in its own list.
using (var form = new FooBar(b.CompactButtons)) {
if (editorService.ShowDialog(form) == DialogResult.OK && context.OnComponentChanging()) {
b.CompactButtons.Clear();
b.CompactButtons.AddRange(form.Buttons);
context.OnComponentChanged();
}
}
return value;
}
Если ваша форма редактора не очень специализированная, вы можетепопробуйте CollectionEditor .