我创建了一个组件来为我们的项目做一些本地化工作。我遇到的问题是我输出的注入 InitializeComponent 的代码发生得太晚了。
例子
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;
}