Gibt es eine Möglichkeit, das Caret der PasswordBox zu verstecken oder zu verschieben?WPF PasswordBox Caret
Antwort
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:
- http://cloudstore.blogspot.com/2008/09/changing-caret-colour-in-wpf.html
- http://blogs.msdn.com/llobo/archive/2007/02/08/changing-caret-color-in-textbox.aspx
Beachten Sie, dass in .NET 4.0 das Caret angepasst wird fähig.
Hoffe, das hilft!
Ich weiß, das ist ein alter Thread, aber weiß jemand etwas über das 'anpassbare Karat' in 4.0? Ich kann es nicht finden – DefenestrationDay
Überprüfen Sie die CaretBrush-Eigenschaft auf der TextBox:
Danke Brad, ich habe nach diesem gesucht. – Nasenbaer
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();
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 .
Gibt es eine Chance, dass Sie näher darauf eingehen? – Joey