3
我已经创建了一个组件来为我们的项目进行本地化。我遇到的问题是我输出的代码被注入到InitializeComponent中发生得太晚了。CodeDomSerializer输出订购
例
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ucHome));
this.localizationResourceManager1 = new Compass0.Localization.LocalizationResourceManager(this.components);
//Other designer code to create controls (this is all in the first block of code in InitializeComponent
Compass0.Localization.XMLResourceManager.Create(typeof(ucViewHome), ref resources); //created by my code serializier
//
// btnLogin
//
等等等等
但什么是由设计者情况是
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ucHome));
this.btnLogin = new ComponentFactory.Krypton.Toolkit.KryptonButton();
this.localizationResourceManager1 = new Compass0.Localization.LocalizationResourceManager(this.components);
//Other designer code to create controls (this is all in the first block of code in InitializeComponent
//
// btnLogin
//
this. btnLogin.Name = "btnLogin";
this. btnLogin.Text = resources.GetString("btnLogin.Text");
Compass0.Localization.XMLResourceManager.Create(typeof(ucViewHome), ref resources); //created by my code serializier
基本上,我需要迫使设计师把我的代码后的3号线资源已经初始化。有没有办法以直接的方式做到这一点?我的代码生成类如下。
public override object Deserialize(IDesignerSerializationManager manager, object codeDomObject)
{
CodeDomSerializer baseSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(LocalizationResourceManager).BaseType, typeof(CodeDomSerializer));
return baseSerializer.Deserialize(manager, codeDomObject);
}
public override object Serialize(IDesignerSerializationManager manager, object value)
{
CodeDomSerializer baseSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(LocalizationResourceManager).
BaseType, typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
if (codeObject is CodeStatementCollection)
{
CodeStatementCollection statements = (CodeStatementCollection)codeObject;
CodeTypeDeclaration classTypeDeclaration = (CodeTypeDeclaration)manager.GetService(typeof(CodeTypeDeclaration));
CodeExpression typeofExpression = new CodeTypeOfExpression(classTypeDeclaration.Name);
CodeDirectionExpression resourceRef = new CodeDirectionExpression(FieldDirection.Ref, new CodeVariableReferenceExpression("resources"));
CodeExpression ResourceManagerAssignment = new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(typeof(XMLResourceManager).ToString()),
"Create", new CodeExpression[] { typeofExpression, resourceRef });
statements.Insert(0, new CodeExpressionStatement(ResourceManagerAssignment));
}
return codeObject;
}