具体的には、しきい値(T)を超えるキーが押された場合に動作をシミュレートしようとしています。Rxを使用して各ウィンドウの取り消しを伴う遅延アクションを1回実行します。
私はReactive Extensions .NET(安定版1.0)を使用して状態変数を使用してこれを実行しようとしています。
は、ここに私の入力の大理石の図だと私は必要なもの:
は
KeyDownイベントを( "押したままキー" を構成するキーアップイベントなしSO 4 DDDD)T = 3を聞かせて: - -dddd --- dd-d-dddddddddd -----
keyUp:----------- u ----- u - u -------- ------- u--
希望:-------- a --------------- a --------- -
これは私が思いついたコードの例ですが、状態変数を使います。
var keyDownStream = Observable.FromEventPattern<KeyEventArgs>(this, "KeyDown").Where(args => args.EventArgs.Key == Key.OemPeriod);
var keyUpStream = Observable.FromEventPattern<KeyEventArgs>(this, "KeyUp").Where(args => args.EventArgs.Key == Key.OemPeriod);
var repeatGuard = false;
keyUpStream.Subscribe(x => repeatGuard = false);
keyDownStream
.DelayOrCancel(TimeSpan.FromSeconds(2.0), keyUpStream)
.Where(_ => repeatGuard == false)
.Do(_ =>
{
repeatGuard = true;
})
.Subscribe(
result =>
{
Console.WriteLine("KeyHold");
}
);
public static class JustinsRx
{
public static IObservable<T> DelayOrCancel<T, TCancel>(this IObservable<T> source,
TimeSpan delay,
IObservable<TCancel> cancel)
{
//argument checking skipped
return from s in source
from i in Observable.Timer(delay).TakeUntil(cancel)
select s;
}
}
進捗アップデート:私はこのクエリをしようとするんだけど、それは実際には、呼び出し元をブロックしています!誰もがなぜこれが呼び出し元をブロックしているので、ウィンドウが表示されないように知っていますか? keyDownStream .DelayOrCancel(TimeSpan.FromSeconds(2)、keyUpStream) .Window(()=> keyUpStream) .Subscribe(結果=> { IF(result.First()== result.Last() ) Console.WriteLine( "KeyHold"); //操作を行う }); – Mooser