Winforms Designer自定义属性在构建时不会保留其值

时间:2014-08-04 16:32:00

标签: winforms visual-studio-2005 designer

我有一个控件,我从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文件中的属性生成代码。还不确定为什么......

编辑:更改了类型转换器的代码。我现在可以通过退格清除该属性。我仍然无法让设计人员生成代码以保留属性值。

丹尼斯

0 个答案:

没有答案