Есть ли способ скрыть или переместить каретку PasswordBox?WPF PasswordBox Caret
ответ
В .NET 3.5 SP1 или предыдущем, нет чистого способа указать цвет WPF TextBox/PasswordBox.
Однако есть способ указать (или в этом случае удалить) эту каретку из вида (через хак). Цвет каретки - это обратный цвет фона фона TextBox/PasswordBox. Т.о., вы можете сделать цвет фона «прозрачным черным», который обманет систему использованием белой каретки (которая не видна).
Код (просто) следующим образом:
<PasswordBox Background="#00000000" />
Для получения дополнительной информации по этому вопросу, пожалуйста, проверьте следующие ссылки:
- 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
Обратите внимание, что в .NET 4.0 Caret будет настраиваться возможность.
Надеюсь, это поможет!
Я знаю, что это старая нить, но кто-нибудь знает что-нибудь о «настраиваемом карате» в 4.0? Я не могу найти его – DefenestrationDay
Проверьте свойство CaretBrush на TextBox:
Спасибо Брэд, я искал это. – Nasenbaer
Вы можете попробовать что-то вроде этого, чтобы установить выбор в PasswordBox:
private void SetSelection(PasswordBox passwordBox, int start, int length)
{
passwordBox.GetType()
.GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(passwordBox, new object[] { start, length });
}
После этого, назовем его так, чтобы установить позицию курсора:
// set the cursor position to 2... or lenght of the password
SetSelection(passwordBox1, 2, 0);
// focus the control to update the selection
passwordBox1.Focus();
Чтобы получить выбор Passwordbox я использую этот код:
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;
}
Протестировано .net 4.0, надеюсь, что это тоже работает ,
Любой шанс, который вы могли бы уточнить по этому поводу? – Joey