Question

J'ai 2 tactiles Toile dans une Application Silverlight.Ce que je dois faire, c'est quand une personne est Titulaire d' (presses et garde en appuyant sur) les deux toiles en même temps incrémenter une valeur une fois sur l'écran.Cela doit se faire pour chaque "double" maintenez-la enfoncée.Je peux le faire amende à l'aide des événements normaux, mais essayé d'écrire la même chose à l'aide de RX et je suis coincé.

Actuellement mon code est identique pour les différents événements de l'approche (utilisation de variables globales et de la méthode globale), mais je pense qu'il doit y avoir une meilleure façon de composer cette.Quelqu'un peut-il suggérer une meilleure approche?

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

Et la très de base DoCheck fonction ressemble à ça....

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

J'espère que vous pouvez voir ce que je suis en train de faire.Chaque toile a une emprise et la libération de l'événement alors, quand HoldLeft et HoldRight sont tous deux tenus de faire quelque chose jusqu'à ce que soit HoldRight ou HoldLeft sont est sorti.

Toute aide serait appréciée.

Était-ce utile?

La solution

Je crois que j'ai résolu mon problème.

Plutôt que sur les multiples s'abonne, je suis allé pour cela.

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

Il semble faire ce que je veux, mais je suis ouvert à d'autres suggestions/améliorations.

Autres conseils

Je suis tombé sur cette réponse et de la pensée qu'il n'avait pas de sens:

    leftHold.Zip(rightHold, (a,b) => true)
        .TakeUntil(leftRelease.Amb(rightRelease))
        .Subscribe(_ => TextOutput.Text =
            (Convert.ToInt32(TextOutput.Text) + 1).ToString());
  • Zip les paires d'événements qui seraient donc exiger que je libère la gauche et le droit, avant d'occuper de nouveau.Si j'ai sorti la droite et la tenue encore une fois cette observable ne mettrait pas le feu de nouveau.
  • J'ai aussi pense que la prise les événements de déclencher une seule fois, donc il y ne devrait pas y avoir besoin pour un TakeUntil appel.
  • Aussi, je ne vois pas comment cette réponse refire - il semble pour obtenir un seul de la valeur.

Voici une autre:

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

Je sais que cette question est d'un an, mais j'aimerais savoir si j'ai raté quelque chose ou si cette réponse œuvres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top