イベントソースをマネージャークラスに追加して、リスナーにイベントを再ディスパッチできるシステムを作成するための最良の方法を見つけようとしています。具体的には、さまざまな入力ソース(キーボード入力ソース、マウス入力ソース、仮想キーボード入力ソースなど)があり、開発者がキーボード入力ソースと入力の両方でKeyDownイベントをリッスンできるようにしたいと思います。マネージャー自体(アクティブな入力ソースからこのイベントをキャッチするため)。
多くの「ディスパッチ」関数を作成することになるソリューションを総当たり攻撃するのは簡単です。イベントが発生したときにイベントを再ディスパッチするだけですが、最終的には数十の単一行関数があり、新しい関数を作成する必要があります。イベントが入力ソースインターフェイスに追加されます。
ラムダの使用を検討しましたが、入力ソースがマネージャーから削除された場合にイベントのフックを解除する方法が必要です。ラムダを入力ソースでキー設定された辞書に保持できますが、イベントの多くは異なるargクラスを持っており、これを行うために複数の辞書を作成すると見苦しくなり始めます。
物事をきれいに保ち、書き留める必要のある追加のコードの量を維持する、これを行う簡単な方法が欠けているのではないかと思います。
参考までに、私が使用しているオブジェクトのサンプルを次に示します。
public interface IInputSource {}
public interface IKeyboardInputSource : IInputSource
{
event EventHandler<KeyboardEventArgs> KeyDown;
event EventHandler<KeyboardEventArgs> KeyUp;
}
public interface IMouseInputSource : IInputSource
{
event EventHandler<MouseEventArgs> MouseDown;
event EventHandler<MouseEventArgs> MouseUp;
}
public class InputManager : IKeyboardInputSource, IMouseInputSource
{
private List<IInputSource> InputSources;
//Event declarations from IKeyboardInputSource and IMouseInputSource
public void AddSource(IInputSource source)
{
InputSources.Add(source);
if (source is IKeyboardInputSource)
{
var keyboardSource = source as IKeyboardInputSource;
keyboardSource.KeyDown += SendKeyDown;
// Listen for other keyboard events...
}
if (source is IMouseInputSource)
{
// Listen for mouse events...
}
}
public void RemoveSource(IInputSource source)
{
if (source is IKeyboardInputSource)
{
var keyboardSource = source as IKeyboardInputSource;
keyboardSource.KeyDown -= SendKeyDown;
// Remove other keyboard events...
}
if (source is IMouseInputSource)
{
// Remove mouse events...
}
InputSources.Remove(source);
}
private void SendKeyDown(object sender, KeyboardEventArgs e)
{
if (KeyDown != null)
KeyDown(sender, e);
}
//Other "send" functions
}