プロジェクトのローカリゼーションのためにいくつかのことを行うコンポーネントを作成しました。私が抱えている問題は、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;
}