locked
Bloquear caracteres PasswordBox RRS feed

  • Pergunta

  • Boa tarde á todos,

    tenho uma aplicação Silverlight em C# onde na tela de login uso um PasswordBox. Gostaria de saber como bloquear alguns caracteres, para que quando o cliente digitar nem aparecer no campo.

    Tenho algo pronto (abaixo) que achei em um fórum aqui da msdn, porém esta me gerando um erro. O meu código ele esta bloqueando sim os caracteres, mais o cursor esta voltando sempre ao inicio da minha passbox e isso nao pode acontecer, por isso este método SetSelection esta aí, ele deveria fazer essa função, más é o mesmo que esta me gerando erro.

    private void SetSelection(PasswordBox passwordBox, int start, int length)
            {            
                passwordBox.GetType().GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(passwordBox, new object[] { start, length });
            }
    private void txtSenha_PasswordChanged(object sender, RoutedEventArgs e)
            {
                string permitidas = "ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwyxz 1234567890@";
    
                for (int i = 0; i < ((PasswordBox)sender).Password.Length; i++)
                {
                    if (!permitidas.Contains(((PasswordBox)sender).Password.Substring(i, 1)))
                    {
                        txtSenha.Password = ((PasswordBox)sender).Password.Remove(i, 1);
                    }
                }
                SetSelection(txtSenha, 2, 0);
            }

    Erro: "Object reference not set to an instance of an object." E eu não sei como resolve-lo.

    Caso alguém tenha outra ideia de como bloquear caracteres em um passwordbox e deixar o cursor de digito no final da box, me ajude. o quanto antes.

    Valeu !!

    link fórum: http://social.msdn.microsoft.com/Forums/pt-BR/wpfpt/thread/92cb1a9b-b589-4410-8ad5-3935149ed60b


    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.

    • Movido Levi Domingos sexta-feira, 15 de junho de 2012 18:42 (De:C#)
    sexta-feira, 15 de junho de 2012 17:33

Respostas

  • Bom um rapaz me ajudou a chegar neste código final.
    Que que foi pensado, a melhor maneira pro meu caso como iria bloquear alguns caracteres era usar um TextBox onde seria mais facil de fazer esse 'bloqueio' e depois apenas passar tudo o que era digitado para "*".
    O problema era que, ao passa tudo para "*" mudava o que estava armazenado no meu Text com isso nao conseguia fazer login, por este motivo foi criado a string textBoxText para que nela fosse armazenada tudo o que era digitado e apenas no textBox eu alterava o valor original, entao no meu login eu teria que passar a string como parametro e nao o TextBox em sí.

    Depois apenas um foreach onde se alguem digitar alguns dos itens listados na string [] era bloqueados.

     private void txtSenha_TextChanged(object sender, TextChangedEventArgs e)
            {
                var textBox = sender as TextBox;
                if (textBox.Text.Length > 0)
                {
                    textBoxText += !textBox.Text.Last().Equals('*') ?
                                        textBox.Text.Last().ToString()
                                        : "";
                    var str = textBox.Text.Aggregate(String.Empty, (current, cha) => current + "*");
                    textBox.Text = str;
                    textBox.SelectionStart = textBox.Text.Length;
    
                    string[] caracteres = { "'", "!", ",", "." };
                    foreach (string x in caracteres)
                    {
                        if (textBoxText.Contains(x))
                        {
                            int quantidade = txtSenha.Text.Length;
                            int subtracao = quantidade - 1;
                            textBoxText = textBoxText.Remove(subtracao);
                            textBox.Text = textBox.Text.Remove(subtracao);
                        }
                    }         
                }
            }

    Fuuui


    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.

    • Marcado como Resposta Seratti segunda-feira, 18 de junho de 2012 19:11
    segunda-feira, 18 de junho de 2012 19:11

Todas as Respostas

  • Eu sei que no TextBox tem uma propriedade chama SelectionStart, existe algo parecido para PasswordBox, procurei infinitamente e nada...

    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.

    segunda-feira, 18 de junho de 2012 16:35
  • Bom um rapaz me ajudou a chegar neste código final.
    Que que foi pensado, a melhor maneira pro meu caso como iria bloquear alguns caracteres era usar um TextBox onde seria mais facil de fazer esse 'bloqueio' e depois apenas passar tudo o que era digitado para "*".
    O problema era que, ao passa tudo para "*" mudava o que estava armazenado no meu Text com isso nao conseguia fazer login, por este motivo foi criado a string textBoxText para que nela fosse armazenada tudo o que era digitado e apenas no textBox eu alterava o valor original, entao no meu login eu teria que passar a string como parametro e nao o TextBox em sí.

    Depois apenas um foreach onde se alguem digitar alguns dos itens listados na string [] era bloqueados.

     private void txtSenha_TextChanged(object sender, TextChangedEventArgs e)
            {
                var textBox = sender as TextBox;
                if (textBox.Text.Length > 0)
                {
                    textBoxText += !textBox.Text.Last().Equals('*') ?
                                        textBox.Text.Last().ToString()
                                        : "";
                    var str = textBox.Text.Aggregate(String.Empty, (current, cha) => current + "*");
                    textBox.Text = str;
                    textBox.SelectionStart = textBox.Text.Length;
    
                    string[] caracteres = { "'", "!", ",", "." };
                    foreach (string x in caracteres)
                    {
                        if (textBoxText.Contains(x))
                        {
                            int quantidade = txtSenha.Text.Length;
                            int subtracao = quantidade - 1;
                            textBoxText = textBoxText.Remove(subtracao);
                            textBox.Text = textBox.Text.Remove(subtracao);
                        }
                    }         
                }
            }

    Fuuui


    Atenciosamente, Guilherme. Caso esta resposta foi útil para seu problema, por favor, marque como mesma. Caso ela apenas responda sua pergunta corretamente, não esqueça de marca-lá.

    • Marcado como Resposta Seratti segunda-feira, 18 de junho de 2012 19:11
    segunda-feira, 18 de junho de 2012 19:11