關於WinForm自定義控制項「設計器模式」

2022-04-20 09:52:51 字數 2732 閱讀 3623

最近在msdn上看到乙個人提問如何把自定義的label拖拽到winform上的時候,autosize自動設定成false。他當時給出的方法是:

[c#]

class mylabel : label

}

[vb.net]

class mylabel

inherits label

public

subnew()

autosize = false

end sub

end class

很簡單,思路似乎也正確——因為mylabel一旦被初始化之後,建構函式應該立即被執行,從而把autosize設定成false。可惜的是,這種做法當你使用手動編碼動態載入的時候毫無問題——

[c#]

private

void form1_load(object sender, eventargs e)

[vb.net]

private

sub form1_load(sender as

object, e as eventargs)

controls.add(new mylabel())

end sub

但是如果是拖拽式載入就會出現問題——當控制項拖拽到winform上去的時候,實際上相當於做了乙個初始化控制項的操作,這個**不是直接生成到form_load中,而是到了乙個私有的函式initializecomponent(乙個專門用於初始化全部窗體上函式以及窗體自身ui設計時候的大雜燴)。同時還預設為label生成了autosize=true。這樣一來,form一旦啟動,先設定autosize=true,接著又把它設定成了false。以下是initializecomponent完成**:

[c#]

private

void initializecomponent()

[vb.net]

private

sub initializecomponent()

me.mylabel1 = new winformcsharp.mylabel()

me.suspendlayout()''

mylabel1

'me.mylabel1.autosize = true

me.mylabel1.location = new system.drawing.point(108, 160)

me.mylabel1.name = "

mylabel1

"me.mylabel1.size = new system.drawing.size(53, 12)

me.mylabel1.tabindex = 0

me.mylabel1.text = "

mylabel1"'

'form1

'me.autoscaledimensions = new system.drawing.sizef(6f, 12f)

me.autoscalemode = system.windows.forms.autoscalemode.font

me.clientsize = new system.drawing.size(284, 262)

me.controls.add(me.mylabel1)

me.name = "

form1

"me.text = "

form1

"addhandler

me.load, addressof

me.form1_load)

me.resumelayout(false)

end sub

那麼如何處理呢?有幾種辦法:

一、重寫initlayout方法,該方法msdn上有明確表示——在載入到容器中的瞬間發生(包括從toolbox)中拖拽到winform上的時候(因為已經進入容器)

[c#]

class mylabel : label

}

[vb.net]

class mylabel

inherits label

protected

overrides

sub initlayout()

mybase.initlayout()

autosize = false

end sub

end class

二、判斷是否是「設計模式」,label繼承自control,而control有乙個屬性叫做"designmode"。因此你可以重寫autosize,然後判斷是否是設計模式

[c#]

class mylabel : label

set}

}}

[vb.net]

class mylabel

inherits label

public

overrides

property autosize() as

boolean

getreturn

mybase.autosize

endget

setif

not designmode then

mybase.autosize = value

endif

endset

end property

end class

WinForm 建立自定義控制項

雖然vs為我們提供了很多控制項可以使用,但有時候這些控制項仍然不能滿足我們的要求,比如我們要對部分控制項進行一些個性化的定製,例如美化控制項,這時候就需要自己繪製控制項,或是在原有控制項的基礎上進行修改 自定義控制項分為三種 1 組合控制項 compositecontrols 在原有控制項的基礎上根...

WinForm自定義Loading控制項

在vs2008下封裝winform自定義loading控制項。autocircle.cs封裝了旋轉的圓形,直接在裡面新增label的話,計算圓形扇面的方法有點小複雜,所以在loadingpanel.cs將autocircle和label封裝在一起。該控制項中提供了當loadingpanel狀態變化時...

winform自定義分頁控制項

1 控制項 public partial class pagercontrol usercontrol endregion region 分頁欄位和屬性 private int pageindex 1 當前頁面 public virtual intpageindex set private int ...