我目前正尝试为类似绘画的WPF应用程序创建类。我必须将类LineMovement(从StartPoint到EndPoint的行)和PathMovement(通过PointCollection类型的属性Point中指定的所有点的行)作为基础。这些类继承自Control并通过ControlTemplate获取它们的外观。
ControlTemplate还为运动对象的AdornerLayer添加了一个Adorner,其中包含特定线的每个可移动点的一个小的可视标记。这些标记支持使用鼠标拖动。
我遇到的问题是,当他们的点被移动时,我的运动类不会重新绘制。我使用Mole调试了我的代码,发现用于可视化线的Polyline获取了更改的点值(在Points属性中可见),但它不会重新绘制。
如何强制重绘WPF控件?
答案 0 :(得分:1)
事实证明,TemplateBinding是纯粹的邪恶。
当我通过{TemplateBinding Points}绑定折线的点时,它不会自行更新,而当我用{Binding RelativeSource = {RelativeSource TemplatedParent}}绑定它时,它可以很好地工作。
请注意:永远不要再使用这个该死的TemplateBinding。
答案 1 :(得分:1)
TemplateBinding不支持双向数据绑定(即使用Polyline的新值更新Points集合)。它仅适用于控制模板中使用的单向数据绑定。请参阅Bea Stollnitz的博客文章:http://bea.stollnitz.com/blog/?p=38
答案 2 :(得分:0)
你需要让Movement对象的DP具有AffectsArrange元数据属性(http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadataoptions.aspx) - 当属性改变时,WPF知道它应该重绘