我有一个控件,我从Label继承子类(作为示例)并向其添加自定义属性。我有一个自定义编辑器,允许我选择自定义类型的对象。自定义类型归因于转换器和编辑器。编辑工作正常 - 我在VS设计器属性网格中的属性单元格中单击并显示省略号。我点击它,我得到我的自定义表单显示我的列表可供选择。我做了一个选择,选择显示在我的属性网格中。都好。但是,我似乎无法像对待大多数属性那样通过退避来清除这个值。更重要的是,一旦我构建项目,属性值就会消失。在构建之前,我可以从控制转到控制并正确设置值,但是一旦构建(或保存并关闭表单),属性就会失去其值。我的自定义控件如下所示:
public class MyLabel : Label
{
private MyAlias _alias;
public MyAlias Alias
{
get
{
return _alias;
}
set
{
if (_alias != value)
{
_alias = value;
}
}
}
}
自定义类型:
[System.ComponentModel.TypeConverter(typeof(MyConverter))]
[System.ComponentModel.Editor(MyTypeEditor, System.Drawing.Design.UITypeEditor)]
public class MyAlias
{
private string _aliasName;
public string AliasName
{
get
{
return _aliasName;
}
set
{
if (_aliasName != value)
{
_aliasName = value;
}
}
}
public MyAlias(string aliasName)
{
if (aliasName == null)
{
return;
}
_aliasName = aliasName;
}
public override string ToString()
{
return _aliasName;
}
}
自定义转换器:
public class MyConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (!(value is string))
{
return base.ConvertFrom(context, culture, value);
}
return new MyAlias((string)value);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == null)
{
throw new ArgumentNullException("destinationType");
}
MyAlias alias = (MyAlias)value;
return alias.ToString();
}
}
自定义编辑器:
public partial class AliasEditorForm : Form
{
private object _value;
public object Value
{
get
{
return _value;
}
set
{
if (_value != value)
{
_value = value;
}
}
}
public AliasEditorForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Button does have DialogResult property set to OK
_value = new MyAlias(...text string from form controls here...);
this.Close();
}
}
public class MyTypeEditor : UITypeEditor
{
protected IWindowsFormsEditorService edSvc = null;
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
{
if (null != context && null != context.Instance && null != provider)
{
edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (null != edSvc)
{
AliasEditorForm form = new AliasEditorForm();
form.Value = value;
DialogResult r = edSvc.ShowDialog(form);
return (DialogResult.OK == r) ? form.Value : value;
}
}
return value;
}
}
自从我在WinForms工作已经很长时间了,我从来没有真正做过多涉及设计时间的事情,所以请原谅我,如果我做了非常愚蠢的事情。如果我没有提供足够的信息,请告诉我。提前谢谢!
编辑:我注意到它没有为form.Designer.cs文件中的属性生成代码。还不确定为什么......
编辑:更改了类型转换器的代码。我现在可以通过退格清除该属性。我仍然无法让设计人员生成代码以保留属性值。
丹尼斯