After some research I know I have to define a serializer for the container, i.e. the form, not the control itself. This serializer has to be a TypeCodeDomSerializer.
The code now looks as follows
[ToolboxItem(true),
DesignerSerializer(typeof(MyFormSerializer), typeof(TypeCodeDomSerializer))]
public class MyForm : Form
{
}
internal class MyFormSerializer : TypeCodeDomSerializer
{
protected TypeCodeDomSerializer GetBaseComponentSerializer(IDesignerSerializationManager manager)
{
return (TypeCodeDomSerializer)
manager.GetSerializer(typeof(Form), typeof(TypeCodeDomSerializer));
}
public override object Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
{
return GetBaseComponentSerializer(manager).Deserialize(manager, declaration);
}
public override CodeTypeDeclaration Serialize(IDesignerSerializationManager manager, object root, System.Collections.ICollection members)
{
TypeCodeDomSerializer baseClassSerializer = GetBaseComponentSerializer(manager);
CodeTypeDeclaration declaration = baseClassSerializer.Serialize(manager, root, members);
foreach (Control member in members)
{
ITranslateableControl translateableCtrl;
CodeTypeMember typeMember = FindTranslateableCtrlCodeTypeMember(member, declaration.Members, out translateableCtrl);
if (typeMember == null) { continue; }
foreach (TranslateablePropertyInfo info in translateableCtrl.TranslateableProperties)
{
CodeAttributeDeclaration attrDeclaration = new CodeAttributeDeclaration(
new CodeTypeReference(typeof(MultiLangTextAttribute)),
new CodeAttributeArgument(new CodePrimitiveExpression(info.TextKey)),
new CodeAttributeArgument(new CodePrimitiveExpression(info.DefaultTexts[CultureInfo.GetCultureInfo("de-DE")])));
typeMember.CustomAttributes.Add(attrDeclaration);
}
}
return declaration;
}
private static CodeTypeMember FindTranslateableCtrlCodeTypeMember(Control ctrl, CodeTypeMemberCollection members, out ITranslateableControl translateableCtrl)
{
translateableCtrl = ctrl as ITranslateableControl;
if (translateableCtrl == null) { return null; }
foreach (CodeTypeMember typeMember in members)
{
if (typeMember.Name.Equals(ctrl.Name))
{
return typeMember;
}
}
return null;
}
}
Now I am able to create the CodeDOM I need. But the designer serialization seems to ignore the CustomAttributes property of the CodeTypeMember because no custom attributes are added to the member variable declaration.
Does anybody know if not all CodeDOM features are supported by visual designer or am I missing something?