【问题标题】:Detect when WPF control moves relative to its parent检测 WPF 控件何时相对于其父控件移动
【发布时间】:2014-09-26 13:20:22
【问题描述】:

我知道如何通过TransformToAncestor 方法找到控件相对于其父级的位置,甚至还有一种方法可以根据该转换确定whether the control is visible to the user

现在我需要检测控件位置的变化。让我们暂时忽略效果和视觉变换以保持简单。我只需要监控Visual.VisualOffset 的变化。这不是依赖属性,也没有关联的更改事件。

Visual.VisualOffset 似乎只在排列阶段更新。也许UIElement.LayoutUpdated 事件可以为我提供正确的通知。但这是一个没有参数的全局事件。每当有任何变化时,我都必须迭代所有受监控的视觉效果。每当用户拖动某些东西时,这种迭代必须每秒进行多达 60 次。

我想知道是否有一些侵入性较小的东西不会迫使我重新检查全局的所有视觉效果。

这是一个例子。查看LazyControl 来源。方法IsInView 使用TransformToAncestor 执行检查。每次该方法所依赖的内容发生变化时,我都需要调用此方法。

【问题讨论】:

  • 您说“这不是依赖属性”,但为什么不直接为它创建一个依赖属性,并将控件的 Top/Left 属性绑定到该依赖属性?
  • @Okuma.Scott 上/左是什么意思?这与 Canvas 无关。这是关于通用视觉树的。您不能只在现有类之上修补依赖属性。它不会与真实财产同步。
  • CompositionTarget.Rendering event 能否提供一个更好的位置来检查您要监控的视觉对象?
  • @RoelvanWesterop 该事件实际上比 LayoutUpdated 更频繁地触发。

标签: c# .net wpf optimization


【解决方案1】:

覆盖UIElement.OnRender怎么样?

【讨论】:

  • 滚动时是否在后代控件树上触发此事件?我认为滚动会跳过它,而是简单地更新整个滚动区域的视觉偏移。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2011-07-22
  • 1970-01-01
相关资源
最近更新 更多