2009-06-01 11 views
4

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

+0

Любой шанс, который вы могли бы уточнить по этому поводу? – Joey

ответ

5

В .NET 3.5 SP1 или предыдущем, нет чистого способа указать цвет WPF TextBox/PasswordBox.

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

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

<PasswordBox Background="#00000000" /> 

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

Обратите внимание, что в .NET 4.0 Caret будет настраиваться возможность.

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

+0

Я знаю, что это старая нить, но кто-нибудь знает что-нибудь о «настраиваемом карате» в 4.0? Я не могу найти его – DefenestrationDay

+1

Проверьте свойство CaretBrush на TextBox:

+0

Спасибо Брэд, я искал это. – Nasenbaer

2

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

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