【问题标题】:Attached Property Changed Event? [duplicate]附加属性更改事件? [复制]
【发布时间】:2010-03-17 13:08:53
【问题描述】:
如果附加属性发生更改,是否有办法获得更改通知?
一个简单的例子是一个Canvas,里面有一个Rectangle。 Rectange 的位置是通过使用 DependendyProperties Canvas.Top 和 Canvas.Left 设置的。我正在使用装饰器通过更改Canvas.Top 和Canvas.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了解详情。但是,我试图找出为什么它在附加属性上对我不起作用(因为这个问题与此有关)。但这个提示至少应该为遇到类似情况的其他人提供一些信息。