2009-06-01 6 views
4

Y at-il un moyen de masquer ou de déplacer le curseur de la PasswordBox?WPF PasswordBox Caret

+0

Y a-t-il une chance que vous en parliez? – Joey

Répondre

5

Dans .NET 3.5 SP1 ou précédent, il n'y a aucun moyen propre de spécifier la couleur d'une zone de texte WPF/PasswordBox caret.

Cependant, il existe un moyen de spécifier (ou, dans ce cas, de supprimer) ce signe de la vue (via un hack). La couleur du caret est la couleur inverse de la couleur d'arrière-plan de TextBox/PasswordBox. Ainsi, vous pouvez rendre la couleur d'arrière-plan "noir transparent", ce qui trompera le système en utilisant un curseur blanc (qui n'est pas visible).

Le code est (simplement) comme suit:

<PasswordBox Background="#00000000" /> 

Pour plus d'informations sur cette question, s'il vous plaît consulter les liens suivants:

Notez que dans .NET 4.0 le Caret sera customiz capable.

Espérons que cela aide!

+0

Je sais que c'est un vieux fil, mais est-ce que quelqu'un sait quelque chose au sujet du «carat personnalisable» dans 4.0? Je ne peux pas le trouver – DefenestrationDay

+1

Vérifiez la propriété CaretBrush sur le TextBox:

+0

Merci Brad, j'ai cherché pour cela. – Nasenbaer

2

Vous pouvez essayer quelque chose comme ceci pour définir la sélection dans le PasswordBox:

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

Après cela, appeler comme celui-ci pour régler la position du curseur:

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

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

Pour obtenir la sélection de Passwordbox j'utilise ce code:

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

Testé à .net 4.0, espérons que cela fonctionne pour vous aussi .