Sharedクラスを使用してアプリケーションのすべての共通オブジェクトを格納するWindowsフォームアプリケーションがあります。設定クラスには、定期的に処理を実行するオブジェクトのコレクションがあります。次に、興味深いものがあります。メインフォームにアラートを送信し、更新する必要があります。
現在、オブジェクトのイベントを介してこれを行っています。各オブジェクトが作成されたら、イベントハンドラーを追加してイベントをフォームにマップします。ただし、これらのリクエストがフォームのメインコピーで常に終了するとは限らないことを示唆する問題が発生しています。たとえば、私のフォームには通知トレイアイコンがありますが、フォームがイベントをキャプチャしてバブルを表示しようとすると、バブルは表示されません。ただし、そのコードを変更してアイコンを表示し(既に表示されていますが)、バブルを表示すると、2番目のアイコンが表示され、バブルが正しく表示されます。
誰かがこれに遭遇したことがありますか?フォームの単一のインスタンスによってすべてのイベントを強制的にキャプチャする方法はありますか、それともこれを処理するまったく異なる方法がありますか?必要に応じてコードサンプルを投稿できますが、これは一般的なスレッドの問題だと思います。
詳細:現在、フォームのイベントハンドラーでMe.InvokeRequiredを使用していますが、この場合は常にFALSEが返されます。また、このフォームから表示したときに作成された2番目のトレイアイコンにはコンテキストメニューがありませんが、「実際の」アイコンにはあります-それは誰かの手がかりになりますか?
髪を抜くぞ!これはそれほど難しいことではありません!
解決策:手がかりを与えてくれたnobugzに感謝します。それにより、現在使用しているコードにたどり着きます(これは美しく機能しますが、これを行うためのより良い方法があると思わずにはいられません)。「IsPrimary」というフォームにプライベートブール変数を追加し、フォームコンストラクターに次のコードを追加しました。
Public Sub New()
If My.Application.OpenForms(0).Equals(Me) Then
Me.IsFirstForm = True
End If
End Sub
この変数が設定されてコンストラクターが終了すると、イベントハンドラーに直接移動し、このように処理します(警告:探しているフォームはアプリケーションのプライマリフォームであるため、My.Application.OpenForms( 0)必要なものを取得します。スタートアップ以外のフォームの最初のインスタンスを探していた場合は、それが見つかるまで繰り返す必要があります):
Public Sub EventHandler()
If Not IsFirstForm Then
Dim f As Form1 = My.Application.OpenForms(0)
f.EventHandler()
Me.Close()
ElseIf InvokeRequired Then
Me.Invoke(New HandlerDelegate(AddressOf EventHandler))
Else
' Do your event handling code '
End If
End Sub
まず、正しいフォームで実行されているかどうかを確認します。実行されていない場合は、正しいフォームを呼び出します。次に、スレッドが正しいかどうかを確認し、正しくない場合はUIスレッドを呼び出します。次に、イベントコードを実行します。潜在的に3回の呼び出しになるのは好きではありませんが、別の方法を考えることはできません。少し面倒ですが、うまくいくようです。誰かがそれを行うためのより良い方法を持っているなら、私はそれを聞いてみたいです!
繰り返しになりますが、すべての助けに感謝します-これは私を狂わせるつもりでした!