扩展的 WPF 工具包 PropertyGrid 密码编辑器
Extended WPF Toolkit PropertyGrid PasswordEditor
我目前正在开发一个使用 Extended WPF Toolkit 库中的 PropertyGrid 的 WPF 应用程序。
为了在独立于语言的庄园中显示名称和描述,我使用了一个包装器 class,其中包含根据提供的文档所需的属性。这里是一个缩短的列表
[LocalizedDisplayName("ServerConfig", typeof(Resources.Strings.Resources))]
public class ServerConfigPropertyGrid
{
#region fields
private ServerConfig serverConfig;
#endregion
#region properties
[LocalizedCategory("VeinStoreCategory", typeof(Resources.Strings.Resources))]
[LocalizedDisplayName("ActiveDirectoryPasswordDisplayName", typeof(Resources.Strings.Resources))]
[LocalizedDescription("ActiveDirectoryPasswordDescription", typeof(Resources.Strings.Resources))]
[Editor(typeof(PasswordEditor), typeof(PasswordEditor))]
public string LdapPassword
{
get { return serverConfig.LdapPassword; }
set { serverConfig.LdapPassword = value; }
}
#endregion
#region constructor
public ServerConfigPropertyGrid(ServerConfig serverConfig)
{
// store serverConfig
this.serverConfig = serverConfig;
}
#endregion
}
现在我想为 LdapPassword 使用自定义编辑器 属性,因为它是一个密码,不应在 PropertyGrid 中显示为纯文本。由于我不是唯一提出此要求的人,也不是第一个提出此要求的人,因此我在 Codeplex 项目的 discussions section 中找到了此类编辑器的实现。
public class PasswordEditor : ITypeEditor
{
#region fields
PropertyItem _propertyItem;
PasswordBox _passwordBox;
#endregion
public FrameworkElement ResolveEditor(PropertyItem propertyItem)
{
_propertyItem = propertyItem;
_passwordBox = new PasswordBox();
_passwordBox.Password = (string)propertyItem.Value;
_passwordBox.LostFocus += OnLostFocus;
return _passwordBox;
}
private void OnLostFocus(object sender, RoutedEventArgs e)
{
// prevent event from bubbeling
e.Handled = true;
if (!_passwordBox.Password.Equals((string)_propertyItem.Value))
{
_propertyItem.Value = _passwordBox.Password;
}
}
}
根据 Codeplex 上提供的文档,所有需要做的就是在 属性 上添加 EditorAttribute,一切都应该没问题,但根本没有显示 PasswordEditor。甚至没有调用构造函数,所以我认为 EditorAttribute 声明一定有问题。
我目前在配置为在 .NET 4.5.1[=28= 中编译的项目中使用版本 2.4.0 的扩展 WPF 工具包].
有人知道哪里出了问题吗?
刚刚自己找到了解决方案。 WPF 应用程序包括一个插件架构,它在运行时加载所有 类 及其依赖项。似乎在查找 Xceed 类 时出现错误,因此在 PropertyGrid 中使用默认编辑器。所以这不是编码错误,而是配置错误。对不起大家占用了你们的时间。
我目前正在开发一个使用 Extended WPF Toolkit 库中的 PropertyGrid 的 WPF 应用程序。
为了在独立于语言的庄园中显示名称和描述,我使用了一个包装器 class,其中包含根据提供的文档所需的属性。这里是一个缩短的列表
[LocalizedDisplayName("ServerConfig", typeof(Resources.Strings.Resources))]
public class ServerConfigPropertyGrid
{
#region fields
private ServerConfig serverConfig;
#endregion
#region properties
[LocalizedCategory("VeinStoreCategory", typeof(Resources.Strings.Resources))]
[LocalizedDisplayName("ActiveDirectoryPasswordDisplayName", typeof(Resources.Strings.Resources))]
[LocalizedDescription("ActiveDirectoryPasswordDescription", typeof(Resources.Strings.Resources))]
[Editor(typeof(PasswordEditor), typeof(PasswordEditor))]
public string LdapPassword
{
get { return serverConfig.LdapPassword; }
set { serverConfig.LdapPassword = value; }
}
#endregion
#region constructor
public ServerConfigPropertyGrid(ServerConfig serverConfig)
{
// store serverConfig
this.serverConfig = serverConfig;
}
#endregion
}
现在我想为 LdapPassword 使用自定义编辑器 属性,因为它是一个密码,不应在 PropertyGrid 中显示为纯文本。由于我不是唯一提出此要求的人,也不是第一个提出此要求的人,因此我在 Codeplex 项目的 discussions section 中找到了此类编辑器的实现。
public class PasswordEditor : ITypeEditor
{
#region fields
PropertyItem _propertyItem;
PasswordBox _passwordBox;
#endregion
public FrameworkElement ResolveEditor(PropertyItem propertyItem)
{
_propertyItem = propertyItem;
_passwordBox = new PasswordBox();
_passwordBox.Password = (string)propertyItem.Value;
_passwordBox.LostFocus += OnLostFocus;
return _passwordBox;
}
private void OnLostFocus(object sender, RoutedEventArgs e)
{
// prevent event from bubbeling
e.Handled = true;
if (!_passwordBox.Password.Equals((string)_propertyItem.Value))
{
_propertyItem.Value = _passwordBox.Password;
}
}
}
根据 Codeplex 上提供的文档,所有需要做的就是在 属性 上添加 EditorAttribute,一切都应该没问题,但根本没有显示 PasswordEditor。甚至没有调用构造函数,所以我认为 EditorAttribute 声明一定有问题。
我目前在配置为在 .NET 4.5.1[=28= 中编译的项目中使用版本 2.4.0 的扩展 WPF 工具包].
有人知道哪里出了问题吗?
刚刚自己找到了解决方案。 WPF 应用程序包括一个插件架构,它在运行时加载所有 类 及其依赖项。似乎在查找 Xceed 类 时出现错误,因此在 PropertyGrid 中使用默认编辑器。所以这不是编码错误,而是配置错误。对不起大家占用了你们的时间。