Windowsフォームデザイナのコード生成をカスタマイズしようとしていますInitializeComponent
。MSDNの記事「.NETFrameworkVisualDesignerでのコード生成のカスタマイズ」には、これを行う方法の基本を説明する「コード生成の制御」セクションが含まれています。
私は上記の記事の例に厳密に従いました:
//using System.ComponentModel.Design.Serialization;
class SomeFormSerializer : CodeDomSerializer
{
public override object Serialize(IDesignerSerializationManager manager,
object value)
{
// first, let the default serializer do its work:
var baseSerializer = (CodeDomSerializer)manager.GetSerializer(
typeof(Form).BaseType, typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
// then, modify the generated CodeDOM -- add a comment as the 1st line:
if (codeObject is CodeStatementCollection)
{
var statements = (CodeStatementCollection)codeObject;
statements.Insert(0, new CodeCommentStatement("CODEDOM WAS HERE"));
}
// finally, return the modified CodeDOM:
return codeObject;
}
}
今、私はこれを私のフォームに接続しますSomeForm
:
[DesignerSerializer(typeof(SomeFormSerializer), typeof(CodeDomSerializer))]
class SomeForm : Form { … }
その後、FormsDesignerは次のInitializeComponent
コードを生成する可能性があります。
private void InitializeComponent()
{
… /* (general setup code, such as a call to `this.SuspendLayout`) */
//
// someButton
//
… /* (someButton's properties are set) */
// CODEDOM WAS HERE!
//
// SomeForm
//
… /* (form's properties are set) */
… /* (general setup code, such as a call to `this.ResumeLayout`) */
}
コメントはの最初の行としてではなく、フォームオブジェクト自体のプロパティを処理するコードブロックの最初の行としてのみ// CODEDOM WAS HERE
追加されていることに注意してください。InitializeComponent
特定のオブジェクトを処理する部分だけでなく、メソッド全体の生成されたCodeDOMを変更できるようにするには、どうすればよいですか?
背景:なぜこれをしたいのですか?Windowsフォームでは、データバインディング中に柔軟な値変換が必要な場合、通常、特定のオブジェクトのイベント
Format
とイベントをサブスクライブする必要があります。そのため、このプロセスを少し単純化する特殊なサブクラス(これを呼びましょう)を作成しています。Parse
Binding
Binding
ConvertingBinding
ここで問題となるのは、Windowsフォームデザイナでデータバインディングを設定すると、生成されたコードが
Binding
;のインスタンスを作成することです。ただし、代わりに、デザイナーに自分の特殊なサブクラスをインスタンス化してもらいたいと思います。私の現在のアプローチは、設計者が最初にCodeDOMツリーを作成し、次にそのツリーをウォークして、のすべてのインスタンス化をのインスタンス化に置き換えることBinding
ですConvertingBinding
。