Pergunta

Eu gostaria de ser capaz de substituir o comportamento padrão para posicionar o cursor em uma caixa de texto mascarado.

O padrão é colocar o cursor onde o mouse foi clicado, a caixa de texto mascarado já contém caracteres devido à máscara.

Eu sei que você pode ocultar o acento circunflexo como mencionado neste pós , existe algo semelhante para posicionar o cursor no início da caixa de texto quando o controle recebe o foco.

Foi útil?

Solução

Isso deve fazer o truque:

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }

Outras dicas

Para melhorar a solução de trabalho de Abbas, tente o seguinte:

private void ueTxtAny_Enter(object sender, EventArgs e)
{
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it.
    MaskedTextBox textBox = sender as MaskedTextBox;

    if (textBox != null)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            int pos = textBox.SelectionStart;

            if (pos > textBox.Text.Length)
                pos = textBox.Text.Length;

            textBox.Select(pos, 0);
        });
    }
}

Este manipulador de eventos pode ser com várias caixas reutilizado, e isso não tira a capacidade do usuário para posicionar o cursor no meio dos dados inseridos (ou seja, não forçar o cursor para a posição zeroeth quando a caixa não é esvaziar).

Eu acho que isso seja mais estreitamente imitando uma caixa de texto padrão. Apenas falha restante (que posso ver) é que após o evento 'Enter', o usuário ainda é capaz de selecionar o resto da (Vazio) mascarar prompt de se xe detém o mouse e arrasta até o fim.

Esta é uma grande melhoria sobre o comportamento padrão do MaskedTextBoxes. Obrigado!

Eu fiz algumas mudanças para excelente solução de Ishmaeel. Eu prefiro chamar BeginInvoke somente se as necessidades do cursor para ser movida. Eu também chamar o método de vários manipuladores de eventos, de modo que o parâmetro de entrada é o MaskedTextBox ativa.

private void    maskedTextBoxGPS_Click( object sender, EventArgs e )
{
    PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}


private void    PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
  if (mtb == null)    return;

  int pos = mtb.SelectionStart;

  if (pos > mtb.Text.Length)
    this.BeginInvoke( (MethodInvoker)delegate()  { mtb.Select( mtb.Text.Length, 0 ); });
}

resposta parcial: você pode posicionar o cursor através da atribuição de uma seleção 0-length para o controle em caso MouseClick, por exemplo:.

MaskedTextBox1.Select(5, 0)

... irá definir o cursor na posição do personagem 5 na caixa de texto.

A razão que esta resposta é apenas parcial, é porque eu não posso pensar de uma maneira geralmente confiável para determinar a posição onde o acento circunflexo deve ser posicionado em um clique. Isso pode ser possível para algumas máscaras, mas em alguns casos comuns (por exemplo, os EUA máscara número de telefone), eu realmente não posso pensar de uma maneira fácil de separar a máscara e caracteres prompt de entrada do usuário real ...

//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
  if (txtAccount.SelectionStart > txtAccount.Text.Length)
    txtAccount.Select(txtAccount.Text.Length, 0);
}

Esta solução funciona para mim. Experimentá-lo por favor.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}

Eu tenho o meu para o trabalho usando o evento Click .... não era necessário Invoke.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}

Esta solução utiliza o método Click do MaskedTextBox como Gman Cornflake utilizado; no entanto, eu achei necessário para permitir que o usuário clique dentro da MaskedTextBox uma vez que continha dados e a estadia cursor onde ele está.

O exemplo abaixo desliga avisos e literais e avalia o comprimento dos dados do MaskedTextBox e se for igual a 0 ele coloca o cursor na posição de partida; caso contrário, apenas ignora o código que coloca o cursor na posição inicial.

O código é escrito em VB.NET 2017. Espero que isso ajude!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top