.NET为winform控件添加自定义属性

Did*_*evy 5 properties custom-controls winforms

将一堆自定义属性附加到.NET中的标准控件,而不创建一组自定义控件会很有用.

我听说它可以用WPF,但有人知道一个简单的winform应用程序的解决方案吗?

为什么?例如,当一个控件具有焦点及其TextBox,DropDownList或ComboBox时,我想在我可以命名的自定义属性中绘制其背景颜色:"focusColor"

当然,我不想创建自定义按钮,组合或下拉...

Tho*_*que 9

在WPF中,它使用附加属性完成.虽然Windows窗体中没有确切的等效项,但您可以实现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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将此代码添加到项目中,FocusColorProvider使用设计器编译并在表单上添加.FocusColor选择控件时,属性网格上应显示一个新属性,只需将其设置为所需的颜色即可.对焦时,控件的BackColor将更改为此颜色.