【问题标题】:Attached Property Changed Event? [duplicate]附加属性更改事件? [复制]
【发布时间】:2010-03-17 13:08:53
【问题描述】:

如果附加属性发生更改,是否有办法获得更改通知?

一个简单的例子是一个Canvas,里面有一个RectangleRectange 的位置是通过使用 DependendyProperties Canvas.TopCanvas.Left 设置的。我正在使用装饰器通过更改Canvas.TopCanvas.Left 来移动矩形。

<Canvas Width="500" Height="500" >
   <Rectangle Width="40" Height="40" Canvas.Left="10" Canvas.Top="20" />
</Canvas>

下一步是在两个Rectangles 之间创建一个箭头。为了跟踪移动的Rectangles,只要Rectangle的位置发生变化,Arrow 就必须收到更改通知。如果我可以在附加属性Canvas.Topchanges 时收到更改通知,这将很容易。

感谢您的帮助, 迈克尔

【问题讨论】:

标签: c# wpf attached-properties


【解决方案1】:

为什么不使用绑定?这正是它们的设计目的......

如果由于某种原因无法使用绑定,则可以添加一个处理程序,以便在属性值更改时收到通知:

var topDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Rectangle));
var leftDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.LeftProperty, typeof(Rectangle));
topDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged);
leftDescriptor.AddValueChanged(rectangle, rectangle_PositionChanged);

...

private void rectangle_PositionChanged(object sender, EventArgs e)
{
    ...
}

【讨论】:

  • 这有助于我进行调试。谢谢!
  • 您应该避免使用 DependencyPropertyDescriptor 进行更改通知,因为如果不清理它们会导致内存泄漏。阅读here了解详情。但是,我试图找出为什么它在附加属性上对我不起作用(因为这个问题与此有关)。但这个提示至少应该为遇到类似情况的其他人提供一些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2019-06-02
  • 2021-04-10
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多