開いたソリューションの既存のプロジェクトにフォームを追加する Visual Studio アドインを作成しました。
これは私がフォームを作成する方法です:
string templatePath = sol.GetProjectItemTemplate("Form.zip", "csproj");
//sol is an EnvDTE80.Solution2
proj.ProjectItems.AddFromTemplate(templatePath, formName);
//proj is an EnvDTE.Project
その後、追加されたフォームの ProjectItem への参照を正常に取得できます。次に、System.Windows.Forms.Form への参照を取得できます。この参照を使用して、次のようにフォームにボタンを追加できます。
Button btn = new Button();
btn.Text = "my funky button";
btn.Name = "newButton";
btn.Size = new Size(150, 23);
btn.Location = new Point(30, 30);
frmNewForm.Controls.Add(btn);
//frmNewForm is a System.Windows.Forms.Form
そして、ボタンがフォームに正常に追加されます。
ただし、このフォームを保存しようとすると、保存されません。Visual Studio の [保存] ボタンをクリックしても、グレーにならないだけです。[すべて保存]をクリックしてもフォームが保存されません。次に、Visual Studio を閉じて再度開き、アドインで新しいフォームを追加したプロジェクトを開きますが、新しいボタンが表示されません。ただの空のフォーム。
次のコードを使用して、プロジェクトとソリューションをプログラムで保存しようとしました。
itemForm.Save(itemForm.Name);
//itemFrom is an EnvDTE.ProjectItem
proj.Save(proj.FullName);
//proj is an EnvDTE.Project
これは、アドインをテストするために使用していた Visual Studio のインスタンスが、アドインを実行した直後に開いたデバッグ用のインスタンスであるためだと考えていました。しかし、インストールされたアドイン (実行後に自動的に残ったもの) を使用してみましたが、問題は解決しませんでした。
更新
2 つのことに気付きました。
1)ボタンはフォームのデザインにのみ表示され、それ以外の場所には表示されません。また、属性を表示するために選択することさえできません。
その名前は、Intellisense、オブジェクト リスト、またはフォームのデザイン ドキュメントにも表示されません。
テストとして、ボタンを手動で追加しました。これを選択して操作できます。
そこから得られるのは、ボタンを適切に追加していないということです。
次に、ボタンに関する新しい質問は次のようになります: EnvDTE を介して作成されたフォームに、設計時に操作できる方法で新しいボタンを追加するにはどうすればよいですか?
2)ファンキーなボタンと手動で追加したボタンとの違いを確認しようとしているときに、プログラムで作成したフォームでこれまでにないことを試みました: インスタンス化して実行します。
そして、これが私がそれを行った方法です:
MyFunkyForm frm = new MyFunkyForm ();
frm.Show();
画面上で点滅し (私の 2 つのボタンは表示されていないようです)、実行が終了します。Form_load で何かをしようとしても、それが実行され、フォームが点滅し、Close() メソッドを呼び出したかのように、実行が終了します (フォームが閉じられ、デバッグが終了します)。
次に、追加の質問は次のとおりです。フォームを追加するときにステップをスキップしましたか、それともフォームをまったく作成していませんか?