0

EnvDTE ライブラリを調べて、フォーム ジェネレータを構築しています。

フォームにコントロールを正常に追加しましたが、コントロールのコードがフォーム デザイナー (formname.Designer.cs) に追加されません。これは、コントロールがまだ宣言されていないため、イベント ハンドラーを追加する場合に問題になります。 .

ボタンをダブルクリックすると、フォーム デザイナーのボタンにイベント ハンドラーが追加され、フォーム デザイナーにすべてのコントロールが追加されます。したがって、更新はそれを行う必要があります。

コントロールを追加する方法は次のとおりです。

//this ProjectItem (itemFrom) is a reference to a recently added form,
//and its only window is my form

Window myWindow = itemForm.Document.Windows.Item(1);

IDesignerHost myDesigner = (IDesignerHost)myWindow.Object;

IComponent comp = myDesigner.CreateComponent(typeof(Button), "MyNewButton);

質問: コントロールへの参照を取得し、イベント ハンドラーをコントロールに追加するために、(EnvDte または VS API を使用して) フォーム デザイナーをプログラムで更新するにはどうすればよいですか?

奇妙な点の 1 つは、VS アドインを使用してフォームにコントロールを追加するチュートリアルをいくつか見つけましたが、この問題について言及しているものはありません..

4

1 に答える 1

1

私は自分の質問に対する答えを見つけましたが、いくつかの副次的な問題にまだ苦労しています:

IEventBindingService myIEventBindingService = (IEventBindingService)myDesigner.GetService(typeof(IEventBindingService));
myIEventBindingService.ShowCode();
//obs: myDesigner is of type IDesignerHost

付随する問題:

1) コードが実際にユーザーに表示されます。これは望ましくありません。
2) 複数回実行することはできません。

複数回実行する理由は、デザイナーが更新されない限りイベント ハンドラーを見つけることができないため、イベント ハンドラーに実際にコードを追加できるようにするために、この更新が必要だからです。これは、すべてのイベント ハンドラーを追加した後に、すべてのコードを追加する必要があることを意味します。したがって、それらを追加する簡単な方法はありません。

この方法では、すべてのイベント ハンドラーを追加し、デザイナーを更新し、名前からイベント ハンドラーへの参照を取得し、その後、イベント ハンドラーが行うことをすべて記述する必要がありました。

私は最終的にこれを修正する予定です (EnvDTE の文書化は不十分です)。その後、この回答を更新します。

于 2011-04-20T12:36:15.067 に答える