У меня в приложении Silverlight есть приложение Canvas с поддержкой двух касаний. Что мне нужно сделать, так это когда человек удерживает (нажимает и продолжает нажимать) оба полотна одновременно, увеличивая значение на экране один раз. Это должно происходить для каждого «двойного» удержания. Я могу сделать это нормально, используя обычные события, но попытался написать то же самое, используя 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() ;
}
}
Надеюсь, вы увидите, что я пытаюсь сделать. У каждого холста есть события hold и release, поэтому, когда HoldLeft и HoldRight оба удерживаются, делают что-то до тех пор, пока не отпустят HoldRight или HoldLeft.
Любая помощь будет оценена.