Pergunta

Eu tenho o toque 2 habilitado lona em um Silverlight App. O que eu preciso fazer é quando uma pessoa segura (prensas e continua pressionando) ambas as telas ao mesmo tempo incrementar um valor na tela uma vez. Isso deve acontecer para cada hold "double". Eu posso fazer isso muito bem usando eventos normais, mas tentou escrever a mesma coisa usando RX e eu estou ficando preso.

Atualmente o meu código é idêntico aos eventos separados abordagem (usando variáveis ??globais e método global), mas eu acho que deve haver uma maneira melhor para compor isso. Alguém pode sugerir uma abordagem melhor?

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

E a função DoCheck parece muito básicos como este ....

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

Esperamos que você pode ver o que estou tentando fazer. Cada tela tem um evento segure e solte assim quando HoldLeft e HoldRight são ambos fazem algo retida até que HoldRight ou HoldLeft são é liberado.

Qualquer ajuda seria apreciada.

Foi útil?

Solução

Creio ter resolvido o meu problema.

Ao invés das múltiplas subscreve eu fui para isso.

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

Parece que fazer o que eu quero, mas estou aberto a outras sugestões / melhorias.

Outras dicas

me deparei com esta resposta e pensei que não fazia sentido:

    leftHold.Zip(rightHold, (a,b) => true)
        .TakeUntil(leftRelease.Amb(rightRelease))
        .Subscribe(_ => TextOutput.Text =
            (Convert.ToInt32(TextOutput.Text) + 1).ToString());
  • pares Zip up Eventos isso seria exigem que eu solte a esquerda e o direito antes de segurá-los novamente. Se eu lançado direito eo segurou novamente este observável não iria fogo novamente.
  • Eu também poderia pensar que o espera apenas os eventos disparar uma vez, por isso não Não deve haver qualquer necessidade de um chamada TakeUntil.
  • Também eu não vejo como esta resposta será refire - parece ficar apenas um valor.

Aqui está uma alternativa:

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

Eu sei que esta questão é um ano de idade, mas eu gostaria de saber se eu perdi alguma coisa ou se esta resposta obras.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top