2010-07-16 55 views
2

我有我自己的控件從Windows.Forms.Control派生,我檢查了OnHandleCreated()方法重寫內的Parent.BackColor。在設計時,Parent屬性首先返回null,然後 - 在表單完全加載後 - 返回真實的父窗口:表單本身。Control.Parent = null

我們需要用父窗體背景的相同顏色繪製部分自定義控件:何時可以依賴Control.Parent值?

謝謝。

回答

2

您可以使用ParentChanged事件來檢測該屬性何時更改並觸發重繪(儘管一個應自動發生)。有一些屬性,但是(BackColorForeColor是我認爲的其中兩個),如果沒有明確設置,那麼這些屬性是從父項「繼承」的,因此您應該也可以使用這些屬性。

0

您可以使用if(this.DesignMode) return;來確定您的控件是否在設計中,並且沒有得到異常或執行其他檢查。在Windows窗體中,在InitilizeComponents之後,afaik控件始終擁有父項。

+0

在父項的'InitializeComponent'之後,這是正確的。 *不在控件中的InitializeComponent後面。 – 2010-07-16 12:14:52

+0

是的,這就是我的意思,謝謝:) – 2010-07-16 12:30:03

0

下面是克里斯·塞爾斯的書引文Windows窗體編程在C#(第259):

的環境屬性是一個,如果它不是在控制設置,將「從容器中繼承「。在Control基類提供的所有標準屬性中,只有四個是環境:BackColor,ForeColor,FontCursor。 [...](由我添加的重點。)    

這也許能以某種方式幫助避免對Control.Parent財產的依賴......?


P.S:實際上,一些其他的答案很可能是更有用的比我:我開始想,也許,OnHandleCreated方法是根本錯誤的地方,要求該控件的父的屬性。 OnParentChanged甚至OnPaint可能是更好的地方。

0

其實我在這裏看不到問題。因爲據我所知你需要父母用父母的背景顏色繪製東西,並且當你收到你的控件的Paint事件(OnPaint,WM_PAINT)父對象已經初始化。