2016-11-01 6 views
0

WF re-hoster 디자이너 솔루션에 사용되는 WPF PropertyGrid에 대한 암호 (마스크) 필드를 작성하려고합니다. 나는 그것의 보안 요소에 관심이 없다. 나는 그저 비밀 번호가 사용자에게 숨겨 지길 원한다. 내가 정말 구현하지만 결국 정말 도움이 위대한 기사를 찾을 생각은 간단했을 것이다 뭔가 고투 : 기사 당으로 PasswordBoxAssistant 클래스를 생성 한 후WPF PropertyGrid의 암호/마스크 필드가 유지되지 않습니다.

WPF PasswordBox and Data binding

을, 내가 가진 WPF UserControl을 생성 다음 XAML과 코드 :

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

코드 숨김

XAML :

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)를 생성하고 나는이 작동하지 않는 부분입니다 있으리라 믿고있어 내가 올바르게 설정하고 있지 않다.

저는 UserControl에서 PropertyValueEditorValue 필드로 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이므로

로 변경되었습니다.

이제 남은 기묘한 문제는 PasswordUserControl에 포함 된 PasswordBox에 문자를 입력 할 때 항상 어떻게 첫 번째 위치에 커서가 놓이는지 a) 정말 이상하고 잘못 보입니다. b) 암호가 나는 '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 이벤트를 변경

:

커서 위치와 반전 문자열 문제를 해결하려면