Silverlightアプリで2タッチ対応のCanvasを使用しています。私がする必要があるのは、人が両方のキャンバスを同時に保持する(押し続ける)ときに、画面上の値を1回インクリメントすることです。これは、すべての「ダブル」ホールドで発生するはずです。通常のイベントを使用してそれをうまく行うことができますが、RXを使用して同じことを書いてみたところ、行き詰まりました。
現在、私のコードは(グローバル変数とグローバルメソッドを使用した)個別のイベントアプローチと同じように見えますが、これを構成するためのより良い方法があるはずだと思います。誰かがより良いアプローチを提案できますか?
var leftHold = Observable.FromEvent<TCanvas.HoldHandler, GestureHoldEventArgs>(
h => new TCanvas.HoldHandler(h),
h => HoldLeft.Hold += h,
h => HoldLeft.Hold += h
);
var rightHold = Observable.FromEvent<TCanvas.HoldHandler, GestureHoldEventArgs>(
h => new TCanvas.HoldHandler(h),
h => HoldRight.Hold += h,
h => HoldRight.Hold += h
);
var rightRelease = Observable.FromEvent<TCanvas.ReleaseHandler, EventArgs>(
h => new TCanvas.ReleaseHandler(e => { }),
h => HoldRight.Release += h,
h => HoldRight.Release += h
);
var leftRelease = Observable.FromEvent<TCanvas.ReleaseHandler, EventArgs>(
h => new TCanvas.ReleaseHandler(e => { }),
h => HoldLeft.Release += h,
h => HoldLeft.Release += h
);
leftHold.Subscribe(e =>
{
_leftHeld = true;
DoCheck();
});
rightHold.Subscribe(e =>
{
_rightHeld = true;
DoCheck();
});
rightRelease.Subscribe(e =>
{
_rightHeld = false;
DoCheck();
});
leftRelease.Subscribe(e =>
{
_leftHeld = false;
DoCheck();
});
そして、非常に基本的なDoCheck関数は次のようになります。
private void DoCheck()
{
if (_rightHeld && _leftHeld)
{
MyTextBox.Text = (Convert.ToInt32(MyTextBox.Text) + 1).ToString() ;
}
}
うまくいけば、あなたは私がやろうとしていることを見ることができます。各キャンバスには保留と解放のイベントがあるため、HoldLeftとHoldRightの両方が保持されている場合は、HoldRightまたはHoldLeftのいずれかが解放されるまで何かを実行します。
どんな助けでもいただければ幸いです。