2009-08-24 194 views
0

我目前尝试为类似油漆的WPF应用程序创建类。我必须基类LineMovement(从StartPoint到EndPoint的线)和PathMovement(线经过属性Points PointCollection中指定的所有点)。这些类从Control继承,并通过ControlTemplate获取它们的外观。强制重绘WPF控件

ControlTemplate还向AdornerLayer的AdornerLayer中添加了一个AdornerLayer,该AdornerLayer包含特定行的每个可移动点的一些可视标记。这些标记支持用鼠标拖动。

我遇到的问题是,我的运动类别在点移动时不会重新绘制。我使用Mole调试了我的代码,发现用于可视化线的Polyline获取已更改的点值(在其Points属性中可见),但它不会重新绘制。

如何强制重绘WPF控件?

回答

1

TemplateBinding不支持双向数据绑定(即使用Polyline的新值更新Points集合)。它仅用于在控制模板中使用的单向数据绑定。见Bea Stollnitz的博客文章:http://bea.stollnitz.com/blog/?p=38

0

你需要让你的运动对象的移民有AffectsArrange元数据属性(http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadataoptions.aspx) - 当属性发生变化,WPF知道它应该重新绘制

+0

已经尝试过。它仍然没有帮助:(。 真的很奇怪的是,当我使用Mole来查看表示Point集合显示改变的点但它没有重新绘制的运动的Polyline时,当我使用Mole来“编辑“(又名采取字符串没有任何改变,并按下”保存“按钮)它重新绘制的折线PointsCollection,因为它应该。 – chrischu 2009-08-25 10:28:54

1

原来,TemplateBinding是纯粹的邪恶的方式。

当我通过{TemplateBinding Points}绑定Polyline的点时,它不会自我更新,而当我使用{Binding RelativeSource = {RelativeSource TemplatedParent}}绑定它时,它完美地工作。

请注意:不要再次使用这个该死的TemplateBinding。