Password/Mask WPF PropertyGrid 中的字段未保留
Password/Mask field in WPF PropertyGrid is not persisted
我正在尝试为 WPF 重新托管设计器解决方案中使用的 WPF PropertyGrid 构建密码(屏蔽)字段。请注意,我对它的安全元素不感兴趣。我只想对用户隐藏密码。我真的为一些我认为很容易实现的事情而苦苦挣扎,但我最终发现这篇很棒的文章真的很有帮助:
WPF PasswordBox and Data binding
根据文章创建 PasswordBoxAssistant class 后,我使用以下 XAML 和代码创建了一个 WPF UserControl:
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;
}
}
然后我创建了一个 PropertyValueEditor
class(称为 PasswordEditor.cs),我假设这是不起作用的部分并且我没有正确设置。
我将 PasswordProperty 从 UserControl
绑定到 PropertyValueEditor
的 Value
字段。
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 activity 并切换回包含密码字段的那个时,它不会保留该值。
谁能指出我正确的方向?
谢谢。
再次强调,如有任何帮助,我们将不胜感激。
谢谢。
我终于明白了!!
解决持久化问题:
我更改的第一件事是在XAML
代码中,我将绑定的Password
属性更改为Value
:
<Grid>
<PasswordBox x:Name="PasswordBox"
Background="Green"
local:PasswordBoxAssistant.BindPassword="true"
local:PasswordBoxAssistant.BoundPassword="{Binding Value, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
我更改的第二件事是在我调用 SetValue
而不是 SetBinding
的 PasswordEditor 中,因此更改为:
passwordBox.SetBinding(PasswordUserControl.PasswordProperty,
passwordBoxBinding);
现在剩下的奇怪问题是,当我在 PasswordUserControl 中包含的 PasswordBox 中键入字符时,它总是以某种方式将光标放在第一个位置,这 a) 真的很奇怪并且看起来不对 b) 它导致密码向后,所以如果我输入 'Hello',它将是 'olleH'。
我知道解决它并继续,我每次都可以简单地反转字符串,但是让光标停留在文本框的前面对我来说太奇怪了,所以我真的很喜欢找出造成这种情况的原因。
解决光标位置和字符串反转问题:
我更改了 PasswordUserControl 中的 PasswordChanged
事件:
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();
}
希望对您有所帮助
我正在尝试为 WPF 重新托管设计器解决方案中使用的 WPF PropertyGrid 构建密码(屏蔽)字段。请注意,我对它的安全元素不感兴趣。我只想对用户隐藏密码。我真的为一些我认为很容易实现的事情而苦苦挣扎,但我最终发现这篇很棒的文章真的很有帮助:
WPF PasswordBox and Data binding
根据文章创建 PasswordBoxAssistant class 后,我使用以下 XAML 和代码创建了一个 WPF UserControl:
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;
}
}
然后我创建了一个 PropertyValueEditor
class(称为 PasswordEditor.cs),我假设这是不起作用的部分并且我没有正确设置。
我将 PasswordProperty 从 UserControl
绑定到 PropertyValueEditor
的 Value
字段。
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 activity 并切换回包含密码字段的那个时,它不会保留该值。
谁能指出我正确的方向?
谢谢。
再次强调,如有任何帮助,我们将不胜感激。
谢谢。
我终于明白了!!
解决持久化问题:
我更改的第一件事是在XAML
代码中,我将绑定的Password
属性更改为Value
:
<Grid>
<PasswordBox x:Name="PasswordBox"
Background="Green"
local:PasswordBoxAssistant.BindPassword="true"
local:PasswordBoxAssistant.BoundPassword="{Binding Value, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
我更改的第二件事是在我调用 SetValue
而不是 SetBinding
的 PasswordEditor 中,因此更改为:
passwordBox.SetBinding(PasswordUserControl.PasswordProperty,
passwordBoxBinding);
现在剩下的奇怪问题是,当我在 PasswordUserControl 中包含的 PasswordBox 中键入字符时,它总是以某种方式将光标放在第一个位置,这 a) 真的很奇怪并且看起来不对 b) 它导致密码向后,所以如果我输入 'Hello',它将是 'olleH'。
我知道解决它并继续,我每次都可以简单地反转字符串,但是让光标停留在文本框的前面对我来说太奇怪了,所以我真的很喜欢找出造成这种情况的原因。
解决光标位置和字符串反转问题:
我更改了 PasswordUserControl 中的 PasswordChanged
事件:
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();
}
希望对您有所帮助