2016-11-01 5 views
0

Я пытаюсь создать поле пароля (маскированного) для WPF PropertyGrid, которое используется в WF-реестре-дизайнере-дизайнере. Обратите внимание, что меня не интересует элемент безопасности. Я просто хочу, чтобы пароль был скрыт от пользователя. Я действительно боролся с чем-то я бы подумал, было бы просто реализовать, но я в конце концов нашел эту статью, которая действительно помогла:Поле пароля/маски в WPF PropertyGrid не сохраняется

WPF PasswordBox and Data binding

После создания PasswordBoxAssistant класса согласно статье, я создал WPF UserControl с следующий XAML и код:

XAML

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

Code-Behind:

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; 
    } 
} 

Затем я создал PropertyValueEditor класса (называемый PasswordEditor.cs), и я предполагаю, что это та часть, которая не работает, и я не правильно настройка.

Я связываю PasswordProperty с UserControl с полем ValuePropertyValueEditor.

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 коде, я изменил переплетены Password свойство Value:

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

Вторая вещь, которую я изменил был PasswordEditor, где я звонил SetValue вместо SetBinding, поэтому это изменение было изменено на:

passwordBox.SetBinding(PasswordUserControl.PasswordProperty, 
         passwordBoxBinding); 

Теперь остальная странная проблема заключается в том, что когда я ввожу символы в PasswordBox, содержащиеся в PasswordUserControl, он как-то всегда помещает курсор в первую позицию, которая a) действительно странная и выглядит неправильно, и b) она вызывает пароль для быть обратным, поэтому, если я наберу «Hello», это будет «olleH».

Я знаю, чтобы обходить его и двигаться дальше, я мог бы просто менять строку каждый раз, но курсор, стоящий перед текстовым полем, слишком странный для моего вкуса, поэтому я действительно хотел бы выяснить, что вызывает это.

Чтобы разрешить позицию курсора и обратную задачу строки:

Я изменил PasswordChanged событие в PasswordUserControl:

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(); 
    } 

Надеется, что это помогает