gpt4 book ai didi

winforms - .NET将自定义属性添加到Winform控件

转载 作者:行者123 更新时间:2023-12-04 17:27:34 24 4
gpt4 key购买 nike

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

我听说使用WPF可以实现,但是有人知道纯Winform应用程序的解决方案吗?

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

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

最佳答案

在WPF中,它是使用attached properties完成的。尽管Windows窗体中没有完全等效的控件,但是您可以实现 IExtenderProvider 以将自定义属性“附加”到控件。然后,可以像常规属性一样在设计器中使用此属性。有关示例,请参见this blog post中提供的代码。

这是您的“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将更改为该颜色。

关于winforms - .NET将自定义属性添加到Winform控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5832492/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com