如何通知UIElement何时被移动(例如:当Panel重新安排其子元素,或者动画正在移动它们时)?
到目前为止,我已经调查过以下死胡同: a)LayoutUpdated事件:当Panel移动时工作 - 但是当动画应用于子事件的位置时不会触发。
b)绑定:我创建了一个带有回调的DP(称为ProxyLeft),并将其绑定为子元素的Canvas.Left DP的值。
这确实有效(因为拾取了子元素的Canvas.Left的所有更改,无论是最终用户还是应用的动画)。 但绑定到Canvas.Left并不是“足够的”:它只有在Panel是Canvas时才有效,但如果Panel是StackPanel则没用; StackPanel不使用Canvas.Left来确定元素的位置(当面板大小改变和/或先前兄弟姐妹的大小增加或更新时,布局会更新,等等。 我想我正在寻找的是子元素的Rect上的绑定......但这不存在。
目前,我没有看到这样做的方法,除非我是Panel(CustomPanel)的创建者,并且可以参与布局机制,并在那时更新子元素的AttachedProperty(例如: CustomPanel.Rect)在那一刻......甚至那将无法工作 - 因为它不会被应用于子元素的动画更新。
元素移动后是否可以通知?如果是这样,怎么样?
非常感谢。
答案 0 :(得分:0)
我认为你问题的简单答案是:不。
您似乎想要一个非常通用的系统来确定元素是否已移动。然而,这样的要求实际上与布局系统相当陌生。
首先需要定义“移动”的真正含义。运动必须相对于某个固定点,那个固定点是什么?屏幕,浏览器客户端窗口,浏览器视图端口,应用程序可视化根,元素的一些任意祖先,元素的直接父级?一些跟踪方法不仅可以改变父母中的元素位置,还可以改变父母在其父母中的位置等等。
布局系统似乎对元素实际上任何地方的任何此类概念都非常敌视。对元素可能位置感兴趣的唯一地方是Panel
调用其Arrange
方法但即使这样,该位置仅相对于Panel
。这个Arrange
方法由UIElement
处理,它不公开其公共接口中的位置。
答案 1 :(得分:0)
我在这里大声思考,所以如果它是愚蠢的,或者如果我误解了这个场景,就忽略它。
为每个目标提供一个调度员。当用户拖动元素或播放动画时,每隔0.1秒左右勾选一次。在每个刻度线上,使用某种全局信使类广播当前位置。您需要为每个目标使用某种唯一标识符,以便Line对象可以监听来自信使的事件,确定它是否是已移动的“他们的”目标对象,如果是,则相应地重绘自己。为了让我的建议运作良好,我猜你需要在动画开始或停止时启动/停止dispatchertimer。否则你可能会以糟糕的表现结束。您预计会有多少个物体同时出现在屏幕上?