2009-06-01 3 views
4

Gibt es eine Möglichkeit, das Caret der PasswordBox zu verstecken oder zu verschieben?WPF PasswordBox Caret

+0

Gibt es eine Chance, dass Sie näher darauf eingehen? – Joey

Antwort

5

In .NET 3.5 SP1 oder früher gibt es keine saubere Möglichkeit, die Farbe eines WPF TextBox/PasswordBox Caret anzugeben.

Es gibt jedoch eine Möglichkeit, das Caret aus Sicht (über einen Hack) anzugeben (oder in diesem Fall zu entfernen). Die Caret-Farbe ist die umgekehrte Farbe der Hintergrundfarbe der TextBox/PasswordBox. THus, Sie können die Hintergrundfarbe "transparent black" machen, was das System dazu bringt, ein weißes Caret zu benutzen (welches nicht sichtbar ist).

Der Code ist (einfach) wie folgt:

<PasswordBox Background="#00000000" /> 

Für weitere Informationen zu diesem Thema finden Sie unter den folgenden Links finden Sie unter:

Beachten Sie, dass in .NET 4.0 das Caret angepasst wird fähig.

Hoffe, das hilft!

+0

Ich weiß, das ist ein alter Thread, aber weiß jemand etwas über das 'anpassbare Karat' in 4.0? Ich kann es nicht finden – DefenestrationDay

+1

Überprüfen Sie die CaretBrush-Eigenschaft auf der TextBox:

+0

Danke Brad, ich habe nach diesem gesucht. – Nasenbaer

2

Sie können so etwas wie diese versuchen, die Auswahl der PasswordBox einzustellen:

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

Danach wird es so nennen sich die Cursor-Position zu setzen:

// 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

die Auswahl von Get Passwortbox ich benutze diesen 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; 
} 

Getestet bei .net 4.0, hoffe, dass das auch für Sie funktioniert .