WPF Passwordbox Caret.
-
06-09-2019 - |
سؤال
هل هناك طريقة لإخفاء أو نقل caret الخاص ب PasswordBox؟
المحلول
في .NET 3.5 المزود بحزمة الخدمة SP1 أو السابق، لا توجد طريقة نظيفة لتحديد لون مربع نص WPF / Passwordbox Caret.
ومع ذلك، هناك طريقة لتحديد (أو في هذه الحالة إزالة) تلك السيرة الذاتية من العرض (عبر الاختراق). اللون Caret هو اللون العكسي لألوان خلفية 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 سوف تكون قابلة للتخصيص.
أتمنى أن يساعدك هذا!
نصائح أخرى
يمكنك تجربة شيء من هذا القبيل لتعيين التحديد في علبة مرور كلمة المرور:
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، نأمل أن يعمل لك أيضا.