Pergunta

Existe uma maneira de esconder ou mover cursor do PasswordBox?

Foi útil?

Solução

Em .NET 3.5 SP1 ou anterior, não há nenhuma maneira limpa para especificar a cor de um WPF TextBox / PasswordBox acento circunflexo.

No entanto, há uma maneira de especificar (ou neste caso remove) que circunflexo da vista (através de um corte). A cor do cursor é a cor inversa da cor de fundo do TextBox / PasswordBox. Assim, você pode fazer a cor de fundo "preto transparente", que vai enganar o sistema em usar um acento circunflexo branco (que não é visível).

O código é (simplesmente) como segue:

<PasswordBox Background="#00000000" />

Para mais informações sobre este assunto, confira os links a seguir:

Note que em .NET 4.0 a Caret será personalizável.

Espero que isso ajude!

Outras dicas

Você pode tentar algo como isto para definir a seleção na PasswordBox:

private void SetSelection(PasswordBox passwordBox, int start, int length)
{ 
    passwordBox.GetType()
               .GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic)
               .Invoke(passwordBox, new object[] { start, length }); 
} 

Depois disso, chamá-lo assim para definir a posição do cursor:

// set the cursor position to 2... or lenght of the password
SetSelection( passwordBox1, 2, 0); 

// focus the control to update the selection 
passwordBox1.Focus(); 

Para obter a seleção de PasswordBox eu uso este código:

private Selection GetSelection(PasswordBox pb)
{
    Selection result = new Selection();
    PropertyInfo infos = pb.GetType().GetProperty("Selection", BindingFlags.NonPublic | BindingFlags.Instance);

    object selection = infos.GetValue(pb, null);

    IEnumerable _textSegments = (IEnumerable)selection.GetType().BaseType.GetField("_textSegments", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(selection);

    object first_textSegments = _textSegments.Cast<object>().FirstOrDefault();

    object start = first_textSegments.GetType().GetProperty("Start", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(first_textSegments, null);
    result.start = (int) start.GetType().GetProperty("Offset", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(start, null);

    object end = first_textSegments.GetType().GetProperty("End", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(first_textSegments, null);
    result.length = (int)start.GetType().GetProperty("Offset", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(end, null) - result.start;

    return result;
}

struct Selection
{
    public int start;
    public int length;
}   

Testado em .NET 4.0, a esperança que funciona para você também.

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