最近在msdn上看到乙個人提問如何把自定義的label拖拽到winform上的時候,autosize自動設定成false。他當時給出的方法是:
[c#]
class mylabel : label}
[vb.net]
class mylabelinherits label
public
subnew()
autosize = false
end sub
end class
很簡單,思路似乎也正確——因為mylabel一旦被初始化之後,建構函式應該立即被執行,從而把autosize設定成false。可惜的是,這種做法當你使用手動編碼動態載入的時候毫無問題——
[c#]
privatevoid form1_load(object sender, eventargs e)
[vb.net]
privatesub 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#]
privatevoid initializecomponent()
[vb.net]
privatesub 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 mylabelinherits label
protected
overrides
sub initlayout()
mybase.initlayout()
autosize = false
end sub
end class
二、判斷是否是「設計模式」,label繼承自control,而control有乙個屬性叫做"designmode"。因此你可以重寫autosize,然後判斷是否是設計模式
[c#]
class mylabel : labelset}
}}
[vb.net]
class mylabelinherits 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 ...