2009-09-03 101 views
15

我正在將WPF應用程序轉換爲Silverlight。Silverlight中的自定義形狀(從WPF移植應用程序)

該應用程序包含一個繼承自Shape的類。它重寫DefiningGeometry屬性以返回一個Path對象。但是,Silverlight Shape類沒有DefiningGeometry屬性。

在互聯網上閱讀我發現其他人也遇到同樣的問題。該解決方案似乎涉及直接從Control繼承,並將Content屬性設置爲路徑。但是,我還想保留我的事件處理程序(MouseEnter,MouseLeave,GotFocus,LostFocus),另外我希望它保持其位置並根據應用程序的其餘部分調整比例。

我主要是一名後端開發人員,所以這不是我的專長 - 如果有人能給我一個如何實現這一目標的大綱示例,我將不勝感激。

+4

如果您發佈原始課程,您可能會收到更多回復。然後其他人可以很快爲你重寫。祝你好運。 – 2010-08-30 15:47:27

+0

這是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

回答

16

由於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中,這些形狀都是內在的 - 插件內置了對EllipsePath以及所有其他形狀的特殊處理。所以這組形狀在Silverilght中不可擴展。沒有OnRender方法在Silverlight中重寫。所以你根本無法編寫自己的自定義類,該類自Silverlight中的Shape派生。

因此,無論是自定義的Control還是UserControl恐怕都是要走的路。這不應該阻止MouseEnterMouseLeave正常工作。你真的發現那些不起作用嗎?或者你只是假設他們不會工作?

+0

+1瞭解你的理論,特別是對於那些新穎的範例。 – Alain 2010-12-16 15:15:29

+0

+1優秀答案 – ColinE 2012-02-17 08:11:02

+0

+1解釋,-1給微軟完全可蹩腳的擴展! – 2012-09-05 17:34:59

0

如果保留現有的類,讓我們稱它爲CustomShape,就像CustomShapeContainer那樣,它是Control所固有的? CustomShapeContainer本質上只是CustomShape的一個包裝。然後,您可以將進入CustomShapeContainer的所有事件直接傳遞到CustomShape,然後將形狀DefininingGeometry對象作爲Containers內容返回。

乍一看,這似乎是阻力最小的路徑。

0

您在Silverlight中沒有相同的命名空間。 Silverlight xaml是WPF xaml的一個子集,有些組件不包含在Silvelright中。這些技術旨在用於不同類型的OS解決方案。

您可能需要重新開始。但是,如果您使用了MVVM模式,那麼您可能會重新使用您的ViewModel,Model和服務。也許資源,樣式可以重用「原樣」。但視圖:開始新的。

0

從Silverlight 3開始,有一種稱爲Path的特殊類型的Shape,它定義了幾何類型的屬性Data。您應該能夠將創建幾何圖形的原始WPF代碼移植到此Data屬性。

+1

我知道你的鏈接建議的MSDN文章,否則,但從一開始,Path就已經在Silverlight中。 – 2011-06-12 21:20:51