2009-12-27 23 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。否则,你可能会以糟糕的表现结束。您预期会同时在屏幕上显示多少个对象?