WPF PasswordBox Caret - PullRequest
       8

WPF PasswordBox Caret

4 голосов
/ 01 июня 2009

Есть ли способ скрыть или переместить каретку PasswordBox?

Ответы [ 3 ]

5 голосов
/ 02 июня 2009

В .NET 3.5 с пакетом обновления 1 (SP1) или более ранней версии нет чистого способа указать цвет каретки WPF TextBox / PasswordBox.

Однако, есть способ указать (или в этом случае удалить), который скрывается из поля зрения (через хак). Цвет каретки - это инвертированный цвет фона TextBox / PasswordBox. Таким образом, вы можете сделать цвет фона «прозрачно-черным», что обманет систему использованием белой каретки (которая не видна).

Код (просто) выглядит следующим образом:

<PasswordBox Background="#00000000" />

Для получения дополнительной информации по этому вопросу, пожалуйста, перейдите по следующим ссылкам:

Обратите внимание, что в .NET 4.0 каретка будет настраиваемой.

Надеюсь, это поможет!

3 голосов
/ 20 марта 2012

Вы можете попробовать что-то вроде этого, чтобы установить выбор в 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(); 
2 голосов
/ 07 мая 2014

Чтобы получить выбор 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, надеюсь, что это работает и для вас.

...