2016-11-01 8 views
0

WF再ホスティングデザイナーソリューションで使用されているWPF PropertyGridのパスワード(マスク)フィールドを作成しようとしています。私はそれのセキュリティ要素には興味がないことに注意してください。私はちょうどユーザーからパスワードを隠したい。私は本当に私は考えが実装にシンプルだっただろうが、私は最終的には本当に助けたこの偉大な記事見出した何かに苦労:記事ごとにPasswordBoxAssistantクラスを作成した後WPF PropertyGridのパスワード/マスクフィールドは保持されません

WPF PasswordBox and Data binding

を、私はWPFユーザーコントロールを作成しました以下のXAMLとコード:

XAMLコードビハインド

<Grid> 
    <PasswordBox x:Name="PasswordBox" 
       Background="Green" 
       local:PasswordBoxAssistant.BindPassword="true" 
       local:PasswordBoxAssistant.BoundPassword="{Binding Password, 
       Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
</Grid> 

public partial class PasswordUserControl : UserControl 
{ 
    public PasswordUserControl() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty PasswordProperty = 
     DependencyProperty.Register("Password", 
     typeof(string), typeof(PasswordUserControl), 
     new FrameworkPropertyMetadata(PasswordChanged)); 

    public string Password 
    { 
     get 
     { 
      return (string)GetValue(PasswordProperty); 
     } 
     set 
     { 
      SetValue(PasswordProperty, value); 
     } 
    } 

    private static void PasswordChanged(DependencyObject source, 
     DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue != null) 
     { 
      (source as PasswordUserControl)?.UpdatePassword(e.NewValue.ToString()); 
     } 
     else 
     { 
      (source as PasswordUserControl)?.UpdatePassword(string.Empty); 
     } 
    } 

    private void UpdatePassword(string newText) 
    { 
     PasswordBox.Password = Password; 
    } 
} 

それから私は(PasswordEditor.csと呼ばれる)PropertyValueEditorクラスを作成し、私は、これは働いていないと私は正しく設定していないよ一部であると仮定しています。

私はのUserControlフィールドからValueフィールドにPasswordPropertyをバインドします。

public class PasswordEditor : PropertyValueEditor 
{ 
    public PasswordEditor() 
    { 
     this.InlineEditorTemplate = new DataTemplate(); 
     FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); 
     FrameworkElementFactory passwordBox = new 
        FrameworkElementFactory(typeof(PasswordUserControl)); 
     Binding passwordBoxBinding = new Binding("Value") { Mode = BindingMode.TwoWay }; 
     passwordBox.SetValue(PasswordUserControl.PasswordProperty, passwordBoxBinding); 
     stack.AppendChild(passwordBox); 
     this.InlineEditorTemplate.VisualTree = stack; 
    } 
} 

私はStringValueにだけでなく、私が発見した他のWF PropertyValueEditorサンプルあたりのが、無駄にそれを設定しようとしました。

パスワード(マスクされた)フィールドがWPF PropertyGridで正しく表示されていますが、別のWFアクティビティに切り替えてパスワードフィールドを含むスイッチに戻っても値が保持されません。

誰でも正しい方向に向けることができますか?

ありがとうございました。

もう一度、助けていただければ幸いです。

ありがとうございました。

答えて

0

私は結局考え出した!

永続性の問題を解決するには:私が変更

最初はXAMLコードにあった、私はValueにバインドさPasswordプロパティを変更:

<Grid> 
    <PasswordBox x:Name="PasswordBox" 
       Background="Green" 
       local:PasswordBoxAssistant.BindPassword="true" 
       local:PasswordBoxAssistant.BoundPassword="{Binding Value, Mode=TwoWay, 
       UpdateSourceTrigger=PropertyChanged}"/> 
</Grid> 

私は変わっ二事がでました私がSetBindingの代わりにSetValueと呼んでいたPasswordEditorなので、これは次のように変更されました:

passwordBox.SetBinding(PasswordUserControl.PasswordProperty, 
         passwordBoxBinding); 

残っている奇妙な問題は、PasswordUserControlに格納されているPasswordBoxに文字を入力すると、どういうわけか、常に最初の位置にカーソルが置かれ、a)本当に奇妙で誤っているように見えることです。逆になるので、「Hello」と入力すると「olleH」になります。

私はそれを回避して移動することを知っていますが、たびに文字列を反転させることができますが、カーソルをテキストボックスの前に置いておくのは味わいがあまりにも奇妙なので、これを引き起こす原因を見つけ出す。

private static void PasswordChanged(DependencyObject source, 
     DependencyPropertyChangedEventArgs e) 
    { 
     var passwordUserControl = source as PasswordUserControl; 

     if (passwordUserControl != null) 
      if (e.NewValue != null) passwordUserControl.Password = 
       e.NewValue.ToString(); 
    } 

ホープこれは

に役立ちます:私はPasswordUserControlで PasswordChangedイベントを変更

は、カーソル位置と逆転した文字列の問題を解決するには

関連する問題