Frage

Ich habe 2 touch-fähige Canvas' in einer Silverlight-App.Was ich tun muss, ist, wenn eine person Hält (drückt und hält drücken) beide Leinwände gleichzeitig Inkrement einen Wert einmal auf den Bildschirm.Dies sollte geschehen, für jede "double" gedrückt halten.Ich kann das gut mit normalen Ereignisse, sondern versucht, schriftlich die gleiche Sache mit RX und ich bin immer stecken.

Derzeit mein code sieht identisch zu den verschiedenen Veranstaltungen Ansatz (Verwendung von globalen Variablen und globalen Methode), aber ich denke, es muss einen besseren Weg zum Komponieren dieses.Kann jemand vorschlagen, eine bessere Ansatz?

        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();
        });

Und die sehr einfache DoCheck-Funktion sieht wie folgt aus....

    private void DoCheck()
    {
        if (_rightHeld && _leftHeld)
        {
            MyTextBox.Text = (Convert.ToInt32(MyTextBox.Text) + 1).ToString() ;
        }
    }

Hoffentlich können Sie sehen, was ich versuche zu tun.Jede Leinwand hat eine hold-und release-Ereignis, also wenn HoldLeft und HoldRight sind beide hatten etwas tun, bis entweder HoldRight oder HoldLeft sind freigegeben.

Jede Hilfe würde geschätzt werden.

War es hilfreich?

Lösung

Ich glaube, ich habe mein eigenes Problem gelöst.

Anstatt die mehrere abonnierten ich für das ging.

        leftHold.Zip(rightHold, (a,b) => true)
            .TakeUntil(leftRelease.Amb(rightRelease))
            .Subscribe(_ => TextOutput.Text = (Convert.ToInt32(TextOutput.Text) + 1).ToString());

Es scheint, zu tun, was ich will, aber ich bin offen für weitere Vorschläge / Verbesserungen.

Andere Tipps

Ich bin auf diese Antwort und dachte, dass es nicht sinnvoll:

    leftHold.Zip(rightHold, (a,b) => true)
        .TakeUntil(leftRelease.Amb(rightRelease))
        .Subscribe(_ => TextOutput.Text =
            (Convert.ToInt32(TextOutput.Text) + 1).ToString());
  • Zip Paare auf Veranstaltungen, so würde Sie verlangen, dass ich lassen Sie die linke und rechts, bevor er Sie wieder.Wenn ich veröffentlichte rechts und hielt es wieder dieses observable würde nicht Feuer wieder.
  • Ich würde auch denken, dass das halten Ereignisse, die nur Feuer einmal, so dass es sollte kein Bedarf für eine TakeUntil rufen.
  • Auch sehe ich nicht, wie diese Antwort wird refire - es scheint nur eine Wert.

Hier ist eine alternative:

var left = leftHold.Select(x => true).Merge(leftRelease.Select(x => false));
var right = rightHold.Select(x => true).Merge(rightRelease.Select(x => false));

var bothHold =
    left.CombineLatest(right, (l, r) => l && r)
        .Where(lr => lr == true)
        .Select(lr => (Convert.ToInt32(MyTextBox.Text) + 1).ToString());

bothHold.Subscribe(t => MyTextBox.Text = t);

Ich weiß, diese Frage ist ein Jahr alt, aber ich würde gerne wissen, ob ich was verpasst habe oder wenn diese Antwort funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top