.NET добавить пользовательские свойства в элементы управления winform - PullRequest
5 голосов
/ 29 апреля 2011

Было бы полезно прикрепить набор пользовательских свойств к стандартным элементам управления в .NET, без создания набора пользовательских элементов управления .

Я слышал, что это возможно с WPF, но кто-нибудь знает решение для простого приложения winform?

Почему? Например, когда элемент управления имеет фокус и его TextBox, или DropDownList, или ComboBox, я хочу нарисовать его задний цвет в пользовательском свойстве, которое я могу назвать: «focusColor»

И, конечно же, я не хочу создавать собственные кнопки, комбо или выпадающие списки ...

Ответы [ 2 ]

9 голосов
/ 29 апреля 2011

В WPF это делается с прикрепленными свойствами . Хотя в Windows Form нет точного эквивалента, вы можете реализовать IExtenderProvider, чтобы «прикрепить» пользовательское свойство к элементу управления. Это свойство затем можно использовать в конструкторе, как обычное свойство. См. Код, приведенный в этом сообщении в блоге для примера.

Вот реализация для вашего примера "FocusColor":

[ProvideProperty("FocusColor", typeof(Control))]
public class FocusColorProvider : Component, IExtenderProvider
{
    private readonly Dictionary<IntPtr, Color> _focusColors;
    private readonly Dictionary<IntPtr, Color> _backColors;

    public FocusColorProvider()
    {
        _focusColors = new Dictionary<IntPtr, Color>();
        _backColors = new Dictionary<IntPtr, Color>();
    }

    public bool CanExtend(object extendee)
    {
        return (extendee is Control);
    }

    public Color GetFocusColor(Control ctl)
    {
        Color color;
        if (_focusColors.TryGetValue(ctl.Handle, out color))
        {
            return color;
        }
        return ctl.BackColor;
    }

    public void SetFocusColor(Control ctl, Color color)
    {
        Color backColor;
        if (!_backColors.TryGetValue(ctl.Handle, out backColor))
        {
            backColor = ctl.BackColor;
        }

        // Same color as BackColor, disable the behavior
        if (color == backColor)
        {
            RemoveFocusColor(ctl);
            ctl.LostFocus -= ctl_LostFocus;
            ctl.GotFocus -= ctl_GotFocus;
            _focusColors.Remove(ctl.Handle);
        }
        else
        {
            _focusColors[ctl.Handle] = color;
            if (ctl.Focused)
                ApplyFocusColor(ctl);
            ctl.LostFocus += ctl_LostFocus;
            ctl.GotFocus += ctl_GotFocus;
        }
    }

    void ctl_GotFocus(object sender, EventArgs e)
    {
        ApplyFocusColor((Control)sender);
    }

    void ctl_LostFocus(object sender, EventArgs e)
    {
        RemoveFocusColor((Control)sender);
    }

    void ApplyFocusColor(Control ctl)
    {
        _backColors[ctl.Handle] = ctl.BackColor;
        ctl.BackColor = GetFocusColor(ctl);
    }

    void RemoveFocusColor(Control ctl)
    {
        Color color;
        if (_backColors.TryGetValue(ctl.Handle, out color))
        {
            ctl.BackColor = color;
            _backColors.Remove(ctl.Handle);
        }
    }
}

Добавьте этот код в свой проект, скомпилируйте и добавьте FocusColorProvider в форму, используя конструктор. Новое свойство FocusColor должно появиться в сетке свойств при выборе элемента управления, просто установите для него нужный цвет. BackColor элемента управления изменится на этот цвет, когда он сфокусируется.

1 голос
/ 29 апреля 2011

Вы можете использовать свойство Tag каждого элемента управления для хранения пользовательских данных, связанных с этим элементом управления. Создайте класс MyCustomAttributes и назначьте объекты этого типа MyControl.Tag. Конечно, это не будет работать в конструкторе, только во время выполнения.

В качестве альтернативы вы можете получить некоторые классы, такие как ExtTextBox из TextBox, ExtDropDownList из DropDrownList и т. Д., Имеющие дополнительные атрибуты. Это очень простой и безболезненный способ создания пользовательских элементов управления, которые могут быть приемлемы в вашем случае, даже если вы сказали, что не хотите такого решения.

...