2011-02-01 14 views
0

WPFには、SecureStringにパスワード入力を受け取るPasswordBoxがありますが、私はWinFormsアプリケーションを持っています。私はSecurePasswordTextBoxを使うことができますが、私はDevExpressコントロールとDevExpressの外観カスタマイズとの融合が欲しいです。 DevExpress社テキストエディットコントロールでは、あなたは本当のUseSystemPasswordChar =を設定することができますが、それはSecureString(としません使用しません:。cf. 10/22/2010cf. alsoDevExpressからSecureStringとしてパスワードを取得する方法WinForms TextEdit

どのように私は簡単にDevExpress社のWinFormsテキストエディットコントロールにサポートをSecureString得ることができます

私は私自身の答えとして以下のポスト何か、思い付いた誰が解決策を持っています

編集:。?私はDevExpress社の外観を必要とするので、私は、働く私自身の答えを、受け入れてい

答えて

1

は私自身の答えです:

代わりに、複雑すぎると思われるサブクラスのテキストエディット、の、私はただの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; 
     } 
    } 
} 
1

最も簡単な方法は、WPFのPasswordBoxをElementHost。

あなたはツールボックスからElementHostコントロールをドラッグするか、コード全体のことを行うことができます。もちろん

public Form1() 
{ 
    InitializeComponent(); 
    System.Windows.Forms.Integration.ElementHost host = new System.Windows.Forms.Integration.ElementHost(); 
    System.Windows.Controls.PasswordBox pb=new System.Windows.Controls.PasswordBox(); 
    host.Child = pb; 
    this.Controls.Add(host); 
} 

このDevExpress社のコントロールを使用していませんが、私は使用のために何らかの理由を見ることができません簡単な選択肢がある場合、パスワードボックスとしてのリッチテキストエディタ。ここで

+0

私はDevExpress社の外観の挙動を失うが、これは非常に簡単です。私はそれを試し、それがどのように見えるかを見るでしょう。私はDevExpress.XtraEditors.TextEditを使用しています。これはリッチテキストではなく、シンプルな一行エディタですが、すぐに使えるSecureString機能を持つ方が良いでしょう。 –

+0

申し訳ありませんが、私が気づいていなかったのは、あなたが保持したいと思っていたDevExpressスタイリングでした。 –

関連する問題