Ich versuche, die Codegenerierung des Windows Forms-Designers für InitializeComponent
anzupassen. Der MSDN-Artikel "Customizing Code Generation in the .NET Framework Visual Designers" enthält einen Abschnitt "Controlling Code Generation", der die Grundlagen erläutert, wie dies getan werden kann.Wie kann ich die Codegenerierung von InitializeComponent anpassen? Genauer gesagt, wie kann ich den gesamten generierten Code nachbearbeiten?
Ich habe aufmerksam verfolgen ein Beispiel, in dem obigen Artikel:
//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;
}
}
ich das jetzt Haken SomeForm
meine Form auf:
[DesignerSerializer(typeof(SomeFormSerializer), typeof(CodeDomSerializer))]
class SomeForm : Form { … }
Der Designer Forms könnte dann erzeugt den folgenden InitializeComponent
Code :
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`) */
}
Beachten Sie, dass die Comme nt // CODEDOM WAS HERE
wurde nicht als erste Zeile in InitializeComponent
hinzugefügt, sondern nur als erste Zeile des Codeblocks, der sich mit den Eigenschaften des Formularobjekts befasst.
Was müsste ich tun, wenn ich das generierte CodeDOM der gesamten Methode modifizieren wollte, und nicht nur des Teils, der sich mit einem bestimmten Objekt befasst?
Hintergrund: Warum möchte ich das tun? Wenn in Windows Forms eine flexible Wertkonvertierung während der Datenbindung gewünscht wird, muss normalerweise auf die Ereignisse
Format
undParse
eines bestimmten ObjektsBinding
abonniert werden. Also erstelle ich eine spezialisierteBinding
Unterklasse (nennen wir esConvertingBinding
), die diesen Prozess ein wenig vereinfacht. Das Problem besteht nun darin, dass beim Erstellen von Datenbindungen im Windows Forms-Designer der generierte Code Instanzen vonBinding
erstellt. Ich möchte jedoch, dass der Designer stattdessen meine spezialisierte Unterklasse instanziiert. Mein derzeitiger Ansatz besteht darin, den Designer zuerst eine CodeDOM-Struktur erstellen zu lassen, dann diese Struktur zu durchlaufen und alle Instanziierungen vonBinding
durch Instanziierungen vonConvertingBinding
zu ersetzen.
Das ist fast, was ich will. Dies scheint ausreichend zu sein, um "bindende" Instanzen zu ersetzen; aber ich kann immer noch nicht auf die ganze Methode zugreifen, d. h. die ersten paar Zeilen und die letzten Zeilen in 'InitializeComponent'. – stakx
@stakx: Die ersten Zeilen in 'InitializeComponent' bestehen immer aus' CodeVariableDeclarationStatement' Objekten. Wenn Sie Änderungen an einem dieser Objekte in 'CodeStatementCollection' vornehmen oder der Sammlung eine neue' CodeVariableDeclarationStatement' hinzufügen, werden alle diese Änderungen in den ersten Zeilen angezeigt. Alle anderen 'CodeStatement'-Zeilen erscheinen nach allen' CodeVariableDeclarationStatement'-Zeilen. – nempoBu4