は私自身の答えです:
代わりに、複雑すぎると思われるサブクラスのテキストエディット、の、私はただのKeyPressイベントをキャッチし、EditValueChangingイベントまで離れ押された文字を隠します。私は、各EditValueChangingイベントでSecureStringで何を変更するかを知るために、偽の文字列に固有のトークンを保持しています。ここで
は、概念実証である - テキストエディットコントロールと2つのイベントハンドラを持つ単純なフォーム:
public partial class PasswordForm : DevExpress.XtraEditors.XtraForm
{
private Random random = new Random();
private HashSet<char> pool = new HashSet<char>();
private char secret;
private char token;
private List<char> fake = new List<char>();
public PasswordForm()
{
InitializeComponent();
this.Password = new SecureString();
for (int i = 0; i < 128; i++)
{
this.pool.Add((char)(' ' + i));
}
}
public SecureString Password { get; private set; }
private void textEditPassword_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
{
string value = e.NewValue as string;
// If any characters have been deleted...
foreach (char c in this.fake.ToArray())
{
if (value.IndexOf(c) == -1)
{
this.Password.RemoveAt(this.fake.IndexOf(c));
this.fake.Remove(c);
this.pool.Add(c);
}
}
// If a character is being added...
if (this.token != '\0')
{
int i = value.IndexOf(this.token);
this.Password.InsertAt(i, this.secret);
this.secret = '\0';
fake.Insert(i, this.token);
}
}
private void textEditPassword_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsControl(e.KeyChar))
{
this.token = '\0';
}
else
{
this.token = this.pool.ElementAt(random.Next(this.pool.Count)); // throws ArgumentOutOfRangeException when pool is empty
this.pool.Remove(this.token);
this.secret = e.KeyChar;
e.KeyChar = this.token;
}
}
}
私はDevExpress社の外観の挙動を失うが、これは非常に簡単です。私はそれを試し、それがどのように見えるかを見るでしょう。私はDevExpress.XtraEditors.TextEditを使用しています。これはリッチテキストではなく、シンプルな一行エディタですが、すぐに使えるSecureString機能を持つ方が良いでしょう。 –
申し訳ありませんが、私が気づいていなかったのは、あなたが保持したいと思っていたDevExpressスタイリングでした。 –