基本的に低レベルのSlimDXラッパー ライブラリをラップし、XBOX 360 コントローラー用の簡単なマネージド API を提供する小さな XBox 360 ワイヤレス コントローラー マネージド インターフェイスを作成しました。
内部的には、クラスは N ミリ秒ごとにゲームパッドをポーリングし、コントローラーの基本的な状態の変化を検出するとイベントを発生させます。
私は、基本的に2つの悪のどちらか少ない方を選択することを余儀なくされているタイマーで行き詰まりを経験しています:
XBox360GamePad クラス UI フレームワーク固有のものを作成します (つまり、WPF/WinForms のサポートはクラスでハードコーディングされ、クラスはこれらのフレームワークを参照する必要があります...)
クラスを完全にフレームワークにとらわれないようにしますが、生成されたイベントに応じて UI を更新できるように、ユーザーに Dispatcher.Invoke / Invoke() 呼び出しをコードに振りかけるように強制します。
後者のオプション (コードを UI に依存しないものにする) を選択した場合、基本的には「汎用」の System.Timers.Timer または UI に依存しない任意のタイマーを使用します。その場合、UI を直接更新できないスレッドからイベントが生成/呼び出されることになります。つまり、WPF では、(醜い) Dispatcher.Invoke を使用して、360 コントローラー クラスから発生したすべての更新を発行する必要があります。 .
一方、XBox 360 Controller クラス内で DispatcherTimer を使用すると、大騒ぎせずに UI を直接更新できる作業コンポーネントがありますが、今ではコントローラー クラス全体が WPF に結合されており、それなしでは使用できません。 WPF に依存 (つまり、純粋なコンソール アプリ)
私が探しているのは、フレームワークにとらわれず、あらゆる種類の Dispatcher.Invoke() 手法に頼らなくても UI を更新できる、ある種のソリューションです...たとえば、共有ベースがあった場合すべてのタイマーのクラス、関連するシナリオに従って、タイマーを依存関係として何らかの形で注入できます..誰かがこの種の問題にうまく対処したことがありますか?