由於Silverlight不支持創建基於Shape
基類的自定義元素,因此您將無法生成以相同方式工作的類。
在Silverlight中無法創建自定義形狀的原因是Silverlight不共享WPF的「可視化層」。如果你想充分理解爲什麼你所嘗試的是不可能的,你需要了解Silverlight和WPF在這裏的區別。 (如果你不在乎,請跳過下面的兩段。)
在WPF中,你可以在兩個完全不同的層次上工作:可視層或框架層。可視化圖層的服務由WindowsBase.dll和PresentationCore.dll提供。這提供了基本的渲染和輸入服務。但是如果你想要樣式,數據綁定,佈局,模板等等,你需要框架服務,並且這些服務由PresentationFramework.dll提供。形狀類型 - Rectangle
,Path
等等 - 都是框架類型 - 它們來自FrameworkElement
,它們支持數據綁定,佈局,動畫等等。但是它們是在可視層之上實現的 - 如果您在Reflector或ILDASM中查看Shape
類型中的任何一個,則會看到它們全都覆蓋了OnRender
方法,這就是定義實際形狀的代碼所在的位置。 (OnRender
是一個可視化圖層功能。)而且由於可視圖層是一個完全支持和記錄的API,因此您可以自由地在WPF中編寫自己的圖形 - 您可以編寫完全相同的代碼,如內置的形狀類。
Silverlight不會使這種視覺/框架的區別 - 在Silverlight中,WPF的可視層已經基本摺疊到框架層中。因此,如果您查看Reflector或ILDASM中的形狀類型,您會發現它們不包含OnRender
方法,並且它們幾乎爲空。這是因爲在Silverlight中,這些形狀都是內在的 - 插件內置了對Ellipse
,Path
以及所有其他形狀的特殊處理。所以這組形狀在Silverilght中不可擴展。沒有OnRender
方法在Silverlight中重寫。所以你根本無法編寫自己的自定義類,該類自Silverlight中的Shape
派生。
因此,無論是自定義的Control
還是UserControl
恐怕都是要走的路。這不應該阻止MouseEnter
和MouseLeave
正常工作。你真的發現那些不起作用嗎?或者你只是假設他們不會工作?
如果您發佈原始課程,您可能會收到更多回復。然後其他人可以很快爲你重寫。祝你好運。 – 2010-08-30 15:47:27
這是silverlight論壇上未解決的問題http://forums.silverlight.net/forums/p/39904/113634.aspx,甚至是silverlight 4中的子類形狀的解決方案(http://blogs.msdn.com/b /nickkramer/archive/2009/12/03/subclassing-shape-or-more-accurately-path.aspx)對DefiningGeometry屬性問題沒有幫助。我們應該爲此解決問題。 – Alain 2010-12-13 20:08:26