マルチスレッドでのWPFカスタムBalloonTips問題
-
23-09-2019 - |
質問
私は他の関連する質問を読みましたが、私はそれは私と一緒に、その上のイムかなりWPFに新たなので、してくださいクマを依頼するのが最善だと思っていたので、私は本当に彼らがこれに関連して取得カントます。
私は(特にFancyBalloon中)カスタムWPFのWindowsでの作業にこのhttp://www.codeproject.com/KB/WPF/wpf_notifyicon.aspx
APIを使用しています。
しかし、私は次のような問題を越え来て、私は別のスレッドでBalloonTipsを始めることができないようです(私はこれを必要とします(つまり、微細な作品)が、それは第二電子メールに来るとき、それはに、TargetInvocationExceptionとクラッシュ{「指定された要素がすでに別の要素の論理的な子である。最初の切断こと。」}
シングは、おそらく同じインスタンスでの作業イムであり、私はそれなどが、無駄にを配置し、前にそれを閉じるために、それを呼び出しを試みてきました。私はそれを処分する場合は、明らかWPF UIコンポーネントがそうバルーンを表示する電子メール+のループ全体の静的なスレッドから呼び出されなければならないよう(再度、私は別のインスタンスを作成カント、私は同じBalloonTipを使用しようとしています。
任意の提案をしてください?私はここで途方に暮れて本当にと私は今、かなり長い間それをしてきた:/
あった場合は、私は思っていた誰もが
解決
一般的に、WPFコントロールは、メインUIスレッドにアクセスして更新されるべきです。スレッドの親和性チェックは、すべてあなたが例えばWPF UIスレッドではない任意のスレッドからのデータバインドプロパティに割り当てた場合、例外がスローされます内臓をデータバインディングの上にあります。
あなたはどちらかあなたのバックグラウンドワーカースレッドからUIコードを削除するか、UIスレッド上で実行するコードのあなたのバックグラウンドスレッドスニペットから呼び出すためのSynchronizationContextの賢明な利用をすることができます。
あなたしているWPFへの新規またはスレッドへの新たな場合は、バックグラウンドスレッドのうち、UIのものを維持する必要があります。 WPFは、ミックスに問題をスレッドの追加の頭痛を追加することなく、忙しいあなたを維持するための複雑さの多くを持っています。
他のヒント
それはあなたが同時に複数の親コンテナに同じUI要素を追加しているようです。
私は同じUI要素オブジェクトを参照して、別のスレッドで同時にmyStackPanel.Children.Add(myUIElementを)しようとした場合、これはあなたが見ているエラーになります。
あなたが複数のスレッドに同じUI要素が必要な場合は、それらのクローンを作成するか、メインスレッドにあなたのUIロジックを移動することを検討してます。