【问题标题】:Canvas doesn't refresh unless the WPF Window is moved除非移动 WPF 窗口,否则画布不会刷新
【发布时间】:2011-04-09 09:13:30
【问题描述】:

我有一个简单的 WPF 窗口,上面有一个 Canvas,Canvas 有一个 Path 对象,Path 内有一个 GeometryGroup:

<Path
      Stroke="Red"
      StrokeThickness="3">
    <Path.Data>
        <GeometryGroup Children="{Binding Elements}" />
    </Path.Data>
</Path>

所以我在调用 InitializeComponent() 之前初始化了 Elements 集合,它会正确显示。之后使用System.Timers.Timer 更新现有形状的点,以便它们移动。这行得通。但问题是我只看到画布在 WPF 窗口被鼠标移动时更新其结果。如果我把它留在那里,那么最后一张图片就会挂在那里,但积分会更新。

当我再次开始移动 WPF 窗口并且形状跳转到它们的最新位置时,我可以看到这一点。

关于如何解决这个问题以及为什么这样做的任何想法?

【问题讨论】:

  • 我猜你做了你的委托来处理 UI 线程,如果不是它会抛出错误。如果我错了,请纠正我,但使用 System.Windows.Threading.DispatcherTimer 可能会更好,因为它直接在 UI 线程上调用
  • 是的,我按照你说的做,所以它可以工作,但我需要在另一个线程上进行计算并更新 UI。我只更新元素,但这仍然需要在 UI 线程中完成。
  • 好的,想试试这个?对于画布,我相信这些类似于 canvas.left。做一个简单的1。在你做你的计算之后,试着从你的计算线程中改变canvas.left的值。如果您可以调用该对象,请尝试调用。示例如下所示:cskardon.wordpress.com/2008/01/03/invoking-ui-changes-in-wpf

标签: c# .net wpf graphics


【解决方案1】:

您需要在要绑定的类上实现 INotifyPropertyChanged,并且项目列表应实现 INotifyCollectionChanged,如 ObservableCollection。一旦你这样做了,就不需要计时器或调度程序。

【讨论】:

  • 谢谢,因此我没有使用定时器。这就像一个类似游戏的应用程序,其中计算必须在一个单独的线程上定期运行以评估游戏世界。我也不能使用 ObservableCollection,因为 GeometryGroup.Children 需要 GeometryCollection。
  • @Joan,我接触 WPF 已经有一段时间了,但如果我记得 ObservableCollection 非常有用。我记得使用 ObservableCollection 绑定到自定义类。因此,如果自定义值发生更改,UI 也会更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2021-05-14
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多