我有我自己的控件從Windows.Forms.Control派生,我檢查了OnHandleCreated()方法重寫內的Parent.BackColor。在設計時,Parent屬性首先返回null,然後 - 在表單完全加載後 - 返回真實的父窗口:表單本身。Control.Parent = null
我們需要用父窗體背景的相同顏色繪製部分自定義控件:何時可以依賴Control.Parent值?
謝謝。
我有我自己的控件從Windows.Forms.Control派生,我檢查了OnHandleCreated()方法重寫內的Parent.BackColor。在設計時,Parent屬性首先返回null,然後 - 在表單完全加載後 - 返回真實的父窗口:表單本身。Control.Parent = null
我們需要用父窗體背景的相同顏色繪製部分自定義控件:何時可以依賴Control.Parent值?
謝謝。
您可以使用ParentChanged
事件來檢測該屬性何時更改並觸發重繪(儘管一個應自動發生)。有一些屬性,但是(BackColor
和ForeColor
是我認爲的其中兩個),如果沒有明確設置,那麼這些屬性是從父項「繼承」的,因此您應該也可以使用這些屬性。
您可以使用if(this.DesignMode) return;
來確定您的控件是否在設計中,並且沒有得到異常或執行其他檢查。在Windows窗體中,在InitilizeComponents之後,afaik控件始終擁有父項。
下面是克里斯·塞爾斯的書引文Windows窗體編程在C#(第259):
的環境屬性是一個,如果它不是在控制設置,將「從容器中繼承「。在
Control
基類提供的所有標準屬性中,只有四個是環境:BackColor
,ForeColor
,Font
和Cursor
。 [...](由我添加的重點。)
這也許能以某種方式幫助避免對Control.Parent
財產的依賴......?
P.S:實際上,一些其他的答案很可能是更有用的比我:我開始想,也許,OnHandleCreated
方法是根本錯誤的地方,要求該控件的父的屬性。 OnParentChanged
甚至OnPaint
可能是更好的地方。
其實我在這裏看不到問題。因爲據我所知你需要父母用父母的背景顏色繪製東西,並且當你收到你的控件的Paint事件(OnPaint,WM_PAINT)父對象已經初始化。
在父項的'InitializeComponent'之後,這是正確的。 *不在控件中的InitializeComponent後面。 – 2010-07-16 12:14:52
是的,這就是我的意思,謝謝:) – 2010-07-16 12:30:03