【问题标题】:Forcing a repaint of a WPF control强制重绘 WPF 控件
【发布时间】:2009-08-24 17:02:26
【问题描述】:

我目前尝试为类似绘画的 WPF 应用程序创建类。我必须基类 LineMovement(从 StartPoint 到 EndPoint 的线)和 PathMovement(穿过 PointCollection 类型的属性 Points 中指定的所有点的线)。这些类继承自 Control,并通过 ControlTemplate 获取外观。

ControlTemplate 还将 Adorner 添加到 Movement 对象的 AdornerLayer 中,其中包含针对特定线的每个可移动点的小视觉标记。这些标记支持用鼠标拖动。

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

如何强制重绘 WPF 控件?

【问题讨论】:

    标签: wpf controls repaint


    【解决方案1】:

    TemplateBinding 不支持双向数据绑定(即使用折线的新值更新 Points 集合)。它仅适用于在控件模板中使用的单向数据绑定。请参阅 Bea Stollnitz 的博客条目:http://bea.stollnitz.com/blog/?p=38

    【讨论】:

      【解决方案2】:

      原来 TemplateBinding 是纯粹的邪恶。

      当我通过 {TemplateBinding Points} 绑定折线的点时,它不会自行更新,而当我使用 {Binding RelativeSource={RelativeSource TemplatedParent}} 绑定它时,它可以完美运行。

      提醒自己:永远不要再使用这个该死的 TemplateBinding。

      【讨论】:

        【解决方案3】:

        您需要使运动对象的 DP 具有 AffectsArrange 元数据属性 (http://msdn.microsoft.com/en-us/library/system.windows.frameworkpropertymetadataoptions.aspx) - 这样当属性更改时,WPF 知道它应该重绘

        【讨论】:

        • 已经试过了。它仍然没有帮助:(。真正奇怪的是,当我使用 Mole 查看代表运动的折线时,它的 Point 集合显示了更改的点,但没有重新绘制。当我使用 Mole 进行“编辑”时(也就是不做任何更改的字符串,然后按“保存”按钮)它应该重新绘制的折线的 PointsCollection。
        猜你喜欢
        • 1970-01-01
        • 2017-04-09
        • 2010-10-23
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多