Procurando algo?

quarta-feira, 14 de dezembro de 2011

Filtrando entrada de dados no Windows Phone 7

Bom, comecei definitivamente a estudar o desenvolvimento de Windows Phone 7. Tive que comprar um novo Laptop pois o antigo já não aguentava o Visual Studio 2010 em toda sua glória e majestade :D Acabei comprando esse carinha aqui:


É um bom laptop e com 8GB em Dual Channel ficou melhor ainda. O teclado centralizado ajuda bastante na hora de digitar muitas linhas de código.

Bom, voltando ao Windows Phone 7, hoje aprendí uma coisa muito interessante sobre o teclado sobreposto do aparelho. Primeiro, você pode definir que teclas aparecerão na tela definindo a propriedade InputScope de um TextBox ou PasswordBox. Dessa forma, o teclado se ajusta ao contexto desejado para aquele campo e exibe somente teclas permitidas para aquele campo.

Os modos disponíveis estão na enumeração InputScopeNameValue e são 62 no total, embora só existam, hoje, 11 modos de teclados diferentes. Talvez os outros sirvam como placeholders para lançamentos futuros ou simplesmente para documentação adicional pra quem for ler seu código. Os modos Digit e Number, por exemplo, exibem as mesmas teclas, porém, se você escolher adequadamente, pode evitar ter que reescrever um trecho de código quando sair o Windows Phone "Rambo" ou "Mambo", sei lá.

Alguns são extremamente interessantes como o modo Chat que exibe abreviaturas para LOL, ROFL, Lolz e outros, bem como emoticons, bem úteis na hora de enviar SMS.  Também tem o modo Maps que carrega sugestões direto do Bing Maps conforme você digita o nome da cidade.

Modo Chat

Modo Number

Para escolher o InputScope desejado, basta adicionar tal informação direto no código XAML do controle. Assim:

<TextBox InputScope="PhoneNumber" />

Fácil, não?
Só que alguns telefones possuem teclado físico deslizante e isso não vai impedí-lo de digitar letras em um campo que só deve aceitar números. Então, você precisa impedir que isso aconteça via código. E é bem simples, veja:

void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    switch(e.Key)
    {
        case Key.D0: case Key.D1: case Key.D2: case Key.D3: case Key.D4:
        case Key.D5: case Key.D6: case Key.D7: case Key.D8: case Key.D9:
            if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
            {
                // O Shift foi pressionado! Isso não é um bug. Acontece que o
                // usuário tentou digitar !@#$%¨&*() que ficam nas mesmas teclas
                // dos dígitos. Isso não é permitido, então engole essa tecla!
                e.Handled = true;
            }
            else
            {
                // Isso pode, então não faça nada. 
            }
            break;
        default:
            // Isso não pode, Segura aê!
            e.Handled = true;
            break;
    }
}

Pronto! Agora além de fornecer apenas as teclas relevantes ao contexto, você também restringiu a entrada incorreta.