элемент управления не обновляется при изменении свойства пользовательского типа - PullRequest
0 голосов
/ 20 июня 2011

Я сделал пользовательский тип для градиентных цветов. У меня нет проблем во время разработки, но когда одно из свойств пользовательского типа изменяется во время выполнения, элемент управления не реагирует на изменения. Вот исходный код:

------------ Пользовательский тип ----------------

[Serializable]
[TypeConverter(typeof(GradientFillConverter))]
public class GradientFill 
{
    private Color startColor = Color.FromKnownColor(KnownColor.Blue);
    private Color endColor = Color.FromKnownColor(KnownColor.White);
    private int angle = 30;

    public GradientFill()
    {
    }

    public GradientFill(Color startColor, Color endColor, int angle)
    {
        this.startColor = startColor;
        this.endColor = endColor;
        this.angle = angle;
    }

    [NotifyParentProperty(true)]
    [RefreshProperties(RefreshProperties.All)]
    public Color StartColor
    {
        get { return this.startColor; }
        set { this.startColor = value; }
    }

    [NotifyParentProperty(true)]
    [RefreshProperties(RefreshProperties.All)]
    public Color EndColor 
    {
        get { return this.endColor; }
        set { this.endColor = value; }
    }

    [NotifyParentProperty(true)]
    [RefreshProperties(RefreshProperties.All)]
    public int Angle
    {
        get { return this.angle; }
        set { this.angle = value; }
    }

    public static bool operator ==(GradientFill gf1, GradientFill gf2)
    {
// some code...
    }

    public static bool operator !=(GradientFill gf1, GradientFill gf2)
    {
// some code...
    }

    public bool CompareValues(object objectToCompare)
    {
// some code...
    }

    public override bool Equals(object obj)
    {
// some code...
    }

    public override int GetHashCode()
    {
// some code...
    }
}

------------------ Тип преобразователя ----------------------

public class GradientFillConverter : ExpandableObjectConverter
{
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(string) ||
            destinationType == typeof(InstanceDescriptor))
            return true;

        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (value != null && value is GradientFill)
        {
            GradientFill gradientFill = (GradientFill)value;

            if (destinationType == typeof(string))
            {
    // returns a string
            }

            if (destinationType == typeof(InstanceDescriptor))
            {
    // returns an Instance Descriptor
            }
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }

    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 != null)
        {
            if (value is string)
            {
    // returns a GradientFill Object
            }
        }

        return base.ConvertFrom(context, culture, value);
    }

    public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
    {
    // returns a GradientFill Object
    }
}

Я определил свойство в своем пользовательском элементе управления следующим образом:

--------- Определение ------------

[Serializable]
public partial class MyControl : Control
{
...
    private GradientFill backgroundGradient = new GradientFill(Color.FromKnownColor(KnownColor.Blue), Color.FromKnownColor(KnownColor.White), 90);
    public GradientFill BackgroundGradient
    {
        get
        {
            return this.backgroundGradient;
        }

        set
        {
            if (!this.backgroundGradient.CompareValues(value))
            {
                this.backgroundGradient = value;
                this.Repaint(); //Actually invalidates the control.
            }
        }
    }
...
}

Любая помощь будет высоко оценена, так как она отнимает у меня много времени.

Спасибо

1 Ответ

0 голосов
/ 20 июня 2011

Вызов Refresh() на контроль и (или) владельца обычно помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...