zoukankan      html  css  js  c++  java
  • c#.net]做tooltip给控件动态添加属性的做法、IExtenderProvider接口的使用

    用过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)

    就说这么多,给自己学习充电,也留给他人分享!

    作者:wpf之家
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Yii2中如何使用CodeCeption
    切换composer国内镜像 Laravel China停用,切换阿里云composer全量镜像
    mysql 不同库不同表字段数据复制
    DataGridView绑定数据库,取得的数据插入到DataGridView指定列(一)
    Winform在一个窗体获取其他窗体的值
    winform按钮和子按钮
    C#生成唯一的ID保存到数据库
    C#Winform从页面获取数据,传入数据库
    C#winform省市县联动,以及有的县是空值时显示异常的处理
    VS2010连接SQLite数据库
  • 原文地址:https://www.cnblogs.com/wpf123/p/2052964.html
Copyright © 2011-2022 走看看