c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用
2010-06-08 08:23 观海看云 阅读(535) 评论(0) 编辑 收藏 举报用过tooltip的人都知道,在添加一个tooltip 后,所有界面上的控件自动加上一个“在tooltip1上的tooltip”的属性,这是怎么实现的呢?这是以为tooltip继承了接口IExtenderProvider,Vs在设计控件的时候就留有接口让程序员扩充控件的属性,这样我们不必为了给控件添加一个小小的属性就继承重写控件了。
例子如下:
写了一个IntelligentSave的类,继承了System.ComponentModel.Component ,IExtenderProvider,并且实现了IExtenderProvider的固定方法,
代码:
using System;
using System.ComponentModel;
using System.Collections;
using System.Windows.Forms;
namespace IntelligentSave
{
/**////
/// Class1 的摘要说明。
///
///
/// Component1 的摘要说明。
///
[ProvideProperty("SaveDeploy", typeof(Control))]//注意SaveDeploy名字必须和GetSaveDeploy、SetSaveDeploy相同
public class IntelligentSave : System.ComponentModel.Component ,IExtenderProvider
{
private Hashtable _innerTable = new Hashtable();
private System.ComponentModel.Container components = null;
public IntelligentSave(System.ComponentModel.IContainer container)
{
InitializeComponent();
}
[DefaultValue(false),Description("")]
public bool GetSaveDeploy(Control control)
{
return this._innerTable.Contains(control);
}
public void SetSaveDeploy(Control control, bool value)
{
if (value)//要保存配置
{
this._innerTable.Add(control, value);
}
else
{
this._innerTable.Remove(control);
}
}
public IntelligentSave()
{
/**////
/// Windows.Forms 类撰写设计器支持所必需的
///
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/**////
/// 清理所有正在使用的资源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/**////
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
#region IExtenderProvider 成员
public bool CanExtend(object extendee)
{
// TODO: 添加 Component1.CanExtend 实现
if (extendee is Control && !(extendee is IntelligentSave))
{
return true;
}
else
{
return false;
}
}
#endregion
}
}
把该代码放到一个cs文件中生成一遍,在另一个项目中添加该组件,并且添加其他的控件,可以看到其他的控件都添加了一个属性,如下intelligentSave1上的SaveDeploy属性。
需要说明的地方:
(1)我添加的是个bool类型的属性,可以添加其他任意类型的属性。在public bool GetSaveDeploy中设定,并且可以设定默认值DefaultValue(false),
(2)我添加的名称是SaveDeploy,可以改成其他任何名字,记住要把GetSaveDeploy 、SetSaveDeploy同时一起改。
(3) public bool CanExtend(object extendee)
{
// TODO: 添加 Component1.CanExtend 实现
if (extendee is Control && !(extendee is IntelligentSave))
{
return true;
}
else
{
return false;
}
}
方法中是是否实现添加属性的代码,如果只需给某一类控件加上属性,那么只需要把extendee is Control 改成extendee is Button等。记住一般情况下要排除自身!(extendee is IntelligentSave)
就说这么多,给自己学习充电,也留给他人分享!
出处:http://www.cnblogs.com/zhangtao/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器