C# ISupportInitialize的使用

System.ComponentModel.ISupportInitialize的BeginInitI()和EndInit()

摘自MSDN:Visual Studio .NET 設計環境使用這個方法,來開始進行用於表單或為另一個元件所使用之元件的初始化。EndInit 方法會結束初始化。

使用 BeginInit 和 EndInit 方法,防止控制項在完全初始化之前被使用。

事例:

 private void InitializeComponent()
        {
            this.qqGlassButton1 = new ControlExs.QQGlassButton();

            ((System.ComponentModel.ISupportInitialize)(this.qqGlassButton1)).BeginInit();
            this.SuspendLayout();
            // 
            // qqGlassButton1
            // 
            this.qqGlassButton1.BackColor = System.Drawing.Color.Transparent;
            this.qqGlassButton1.DialogResult = System.Windows.Forms.DialogResult.None;
            this.qqGlassButton1.Font = new System.Drawing.Font("Microsoft YaHei", 9F);
            this.qqGlassButton1.Location = new System.Drawing.Point(0, 0);
            this.qqGlassButton1.Name = "qqGlassButton1";
            this.qqGlassButton1.Size = new System.Drawing.Size(75, 23);
            this.qqGlassButton1.TabIndex = 0;
            this.qqGlassButton1.TabStop = false;
            this.qqGlassButton1.Text = "qqGlassButton1";
            this.qqGlassButton1.ToolTipText = null;
            ((System.ComponentModel.ISupportInitialize)(this.qqGlassButton1)).EndInit();
            this.ResumeLayout(false);

        }
    }
}

https://social.msdn.microsoft.com/Forums/exchange/zh-CN/f56d7563-b704-4c27-8429-384ccc28d17a/systemcomponentmodelisupportinitializebegininitiendinit

C#中,如果你想创建一个自定义控件并允许开发者自由添加属性,你需要通过继承`System.Windows.Forms.Control`或`System.Drawing.Design.UserControlDesigner`类,并实现`ISupportInitialize`接口来管理初始化过程。然后,你可以使用`PropertyGrid`或者`DesignerSerializationManager`来实现属性的添加和序列化。 以下是基本步骤: 1. 创建一个自定义控件类,例如MyCustomControl,并从`Control`继承: ```csharp public class MyCustomControl : Control, ISupportInitialize { // 假设我们有一个名为"myProperty"的属性 public string MyProperty { get; set; } // 实现BeginInit和EndInit方法,以便于在属性改变时自动调整 public voidBeginInit() { // 初始化逻辑 } public voidEndInit() { // 可选的更新控件状态或刷新 UI 的操作 } } ``` 2. 将属性添加到属性列表: ```csharp protected override PropertyDescriptorCollection GetProperties() { var properties = TypeDescriptor.GetProperties(base.GetType()); properties.Add(new CustomPropertyDescriptor("MyProperty", this)); // 自定义的属性描述符 return properties; } // CustomPropertyDescriptor 类用于自定义属性描述符 private class CustomPropertyDescriptor : PropertyDescriptor { // ... } ``` 3. 使用`DesignerSerializationManager`来支持属性编辑器,比如`PropertyGrid`: ```csharp public override object GetPropertyValue(System.ComponentModel.PropertyDescriptor pd) { if (pd.Name == "MyProperty") { return MyProperty; } return base.GetPropertyValue(pd); } public override void SetPropertyValue(System.ComponentModel.PropertyDescriptor pd, object value) { if (pd.Name == "MyProperty") { MyProperty = (string)value; } else { base.SetPropertyValue(pd, value); } } ``` 现在开发者就可以在`PropertyGrid`或其他属性编辑器中看到并编辑你自定义的`MyProperty`属性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值