有没有办法隐藏或移动 PasswordBox 的插入符号?
问问题
4394 次
4 回答
5
在 .NET 3.5 SP1 或更早版本中,没有明确的方法来指定 WPF 文本框/密码框插入符号的颜色。
但是,有一种方法可以从视图中指定(或在这种情况下删除)插入符号(通过 hack)。插入符号颜色是 TextBox/PasswordBox 的背景颜色的反色。因此,您可以使背景颜色为“透明黑色”,这将欺骗系统使用白色插入符号(不可见)。
代码(简单)如下:
<PasswordBox Background="#00000000" />
有关此问题的更多信息,请查看以下链接:
- http://cloudstore.blogspot.com/2008/09/changeing-caret-colour-in-wpf.html
- http://blogs.msdn.com/llobo/archive/2007/02/08/chang-caret-color-in-textbox.aspx
请注意,在 .NET 4.0 中,插入符号将是可定制的。
希望这可以帮助!
于 2009-06-02T06:17:00.897 回答
4
您可以尝试这样的事情来设置 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();
于 2012-03-20T12:43:54.230 回答
3
要选择 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 测试,希望对你也有用。
于 2014-05-07T16:28:48.203 回答
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>
这实际上是我使用样式的实现,您可以修改代码以满足您的需求。希望能帮助到你。
于 2020-02-26T11:37:56.380 回答