2009-12-27 21 views
2

如何通知UIElement何時被移動(例如:當Panel重新排列其子元素,或者動畫正在移動它們時)?Silverlight:如何移動元素時通知我?

到目前爲止,我已經調查了以下死角: a)LayoutUpdated事件:當Panel移動東西時起作用 - 但在動畫應用到子事件的位置時不會觸發。

b)綁定:我用回調創建了一個DP(稱爲ProxyLeft),並將它綁定到子元素的Canvas.Left DP的值。

這確實有效(因爲對最終用戶或應用動畫的子元素的Canvas.Left所做的所有更改都會被拾取)。 但是Canvas.Left的綁定不是'hollistic enough':它只會在面板是Canvas的情況下才起作用,但如果面板是StackPanel則沒有用(StackPanel的不使用Canvas.Left來確定元素的位置(當面板尺寸變化和/或之前的兄弟姐妹在尺寸上添加或更新等時,佈局被更新) 我想我正在尋找的是對子元素的Rect的綁定......但是, 't exists。

目前,我沒有看到這樣做的方式,除非我是Panel(CustomPanel)的創建者並且可以參與佈局機制,並且在那一刻更新一個AttachedProperty子元素(例如:CustomPanel.Rect)......並且即使這樣也不起作用 - 因爲它不會被應用於子元素的動畫更新。

元素移動時可以通知嗎?如果是這樣,怎麼樣?

非常感謝。

+0

在a)你正在聽哪個元素的LayoutUpdated?面板還是您想要遵循的元素? – AnthonyWJones 2009-12-28 17:24:30

回答

0

我認爲你的問題的簡單答案是:不。

您似乎想要一個非常通用的系統來確定元素是否已移動。然而,這樣的要求實際上與佈局系統很不相同。

它首先需要定義「移動」的真正含義。運動必須相對於某個固定點,那個固定點是什麼?屏幕,瀏覽器客戶端窗口,瀏覽器視圖端口,Application Visual Root,元素的某個任意祖先,元素的直接父代?一些跟蹤變化的方法不僅僅是父母中的元素位置,還有父母在其父母等中的位置可能是需要的。

佈局系統似乎對任何這樣的元素的任何這樣的概念都非常敵視,特別是在任何地方。對元素可能存在興趣的唯一地方是Panel調用其Arrange方法的位置,但即使此位置僅相對於PanelArrange方法由UIElement處理,該公開界面中沒有公開任何位置。

+0

你好Anyyony: 我想呈現一個線(認爲Visio箭頭/鏈接)到面板中的目標元素。解決這個問題的一種方法是安排目標和它們之間的界限。好的...但不靈活。 更靈活的是隻安排目標,並讓他們'將'他們的新位置'廣播'到線路中,這些線路將根據接收到的更新目標Rect重新繪製自己。 Allong在此提出的線路: http://silverlightfoundry.blogspot.com/2009/04/element-binding-that-acts-like-visio.html – Ciel 2009-12-29 03:39:35

+0

我同意「移動」是一個細微的主題...原始Rect相對於conatiner,它的翻譯...它的投影... 基本上我們正在討論的是,在任何時候相對於約定的上下文(例如:父面板)更新目標目標的Rect時都會被警告。 我認爲涵蓋所有這些基礎的唯一解決方案是: http://skysigal.xact-solutions.com/Blog/tabid/427/EntryId/1071/Silverlight-Detecting-changes-in-location-of- a-Panel-rsquo-s-Children.aspx 但是它依靠一些非常昂貴的舉措...因此我檢查是否有人有更便宜的解決方案... – Ciel 2009-12-29 03:43:54

+0

我想你可能需要檢查你爲什麼需要更靈活的解決方案。如果你這樣做,那麼你將不得不付出代價或看看不同的基礎技術來提供所需的用戶界面。 – AnthonyWJones 2009-12-29 17:11:28

0

我在這裏大聲思考,所以如果它很愚蠢,或者我誤解了這種情況,就忽略它。

給每個目標一個dispatchertimer。當用戶拖動元素或正在播放動畫時,請每隔0.1秒打勾一次。在每個勾號上,使用某種全球信使類廣播當前位置。您需要爲每個目標設置一些唯一標識符,以便Line對象可以偵聽來自Messenger的事件,確定它是否是「他們」的已移動目標對象,如果是,則相應地重繪自己。對於我的建議來說,我認爲每當動畫開始或停止時,您都需要啓動/停止dispatchertimer。否則,你可能會以糟糕的表現結束。您預期會同時在屏幕上顯示多少個對象?