2010-09-02 46 views
14

CompositionTarget.Rendering事件是一個普通的舊EventHandler,具有普通的舊EventArgs。但是,在現實生活中,它顯然總是獲得RenderingEventArgs的實例。因此,您的事件處理程序必須先投射EventArgs以獲取有用的信息。爲什麼CompositionTarget.Rendering需要使用EventArgs而不是RenderingEventArgs?

爲什麼不是EventHandler<RenderingEventArgs>類型的事件,所以我們能夠爭取到的參數更容易(更重要的,所以我們甚至可以知道參數是有)爲什麼微軟會選擇給這個事件添加錯誤的簽名?

我想知道向後兼容性 - 是否有RenderingEventArgs不存在的版本? - 但似乎並非如此。根據MSDN,RenderingEventArgs和CompositionTarget是在兩個平臺的相同版本中引入的 - 在WPF中,兩者都是在.NET 3.0中添加的;在Silverlight中,兩者都是在Silverlight 3.0中添加的。

如果它提供了任何提示,我碰到了一個老的discussion thread,有人說:「這個委託使用EventArgs,因爲這樣做有一定的性能。如果有人能夠解釋什麼樣的表現可能會勝出,我會願意接受這個答案。

+0

+1:鼠標事件也發生同樣的事情。您經常需要手動將它們更改爲更具體的MouseEventArgs以獲取* cool *屬性。 – 2010-09-02 13:18:03

回答

2

編組獲勝可能是低級別的內存管理事情。由於EventArgs是事件最常見的參數形式,因此在處理插件實現的低級事件中可能會預先分配緩衝區。它甚至可能只是在某些平臺上獲勝,並且只能進行密集渲染。

在最新的SL版本中渲染速度已經得到顯着改善,我懷疑它是這樣的調整正在推動這一點。

當接口因實現而受到影響時,這是一種痛苦,但如果勝利是顯着的,則這是公平的。此外,在這種情況下,功能並沒有真正的損失,因爲它很容易投射並獲取底層數據。

相關問題