WPF PasswordBox Caret

时间:2009-06-01 17:09:53

标签: wpf caret passwordbox

有没有办法隐藏或移动PasswordBox的插入符?

4 个答案:

答案 0 :(得分:5)

在.NET 3.5 SP1或更早版本中,没有简洁的方法来指定WPF TextBox / PasswordBox插入符的颜色。

但是,有一种方法可以从视图(通过黑客)指定(或在这种情况下删除)该插入符号。插入符号颜色是TextBox / PasswordBox的背景颜色的反色。那么,你可以使背景颜色为“透明黑色”,这会使系统陷入使用白色插入符号(这是不可见的)。

代码(简单地)如下:

<PasswordBox Background="#00000000" />

有关此问题的更多信息,请查看以下链接:

请注意,在.NET 4.0中,Caret可以自定义。

希望这有帮助!

答案 1 :(得分:3)

您可以尝试使用类似的方法在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 :(得分:2)

要获取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测试过,希望对你有用。

答案 3 :(得分:0)

通过.NET 4.5.2上的.xaml解决此问题的解决方案:

   <PasswordBox Style="{DynamicResource PinEntry}">

然后在PinEntry样式下的样式文件上,可以执行以下操作:

    <Style x:Key="PinEntry" TargetType="{x:Type PasswordBox}">
       ...
       <Setter Property="CaretBrush" Value="Transparent"/>
       ...
    </Style>

这实际上是我使用样式的实现,您可以修改代码以适合您的需求。 希望对您有所帮助。