所以在模型方面,我有一个 100x100 的 Cell 对象数组。这些对象有一个属性 State,它是一个布尔值。Cell 实现 INotifyPropertyChanged。我还有一个 CellCollection 对象,它包含 100x100 数组并具有修改该数组的方法。
在视图方面,我有一个包含 10,000 个 Rectangle 控件的画布,它们排列在一个 100x100 的网格中。100x100 数组的每个元素都设置为 Canvas 中它们对应的 Rectangle 的 DataContext。DataTrigger 是为 XAML 中的 Rectangle 控件定义的,该控件绑定在 Rectangle 的 DataContext 的 State 属性上。如果 State 的值为 True,则将 Rectangle 的背景设置为黑色(通过 Setter),如果为 False,则将背景设置为白色。
现在我有一个以 100 毫秒间隔运行的 DispatcherTimer,它调用 CellCollection 对象上的一个方法。该方法评估数组的状态,并更改其某些元素的 State 属性的值。随着 State 属性的值发生变化,这些变化会按预期反映在 GUI 中。
唯一的问题是它非常慢。
因此调度程序调用的 CellCollection 方法分两部分工作:首先它计算单元数组的新状态应该是什么,并将结果存储在一个 100x100 布尔数组中。其次,它遍历 Cell 数组并根据 bool 数组中的值更新其元素的 State 属性。我在控制台上打印了一些时间戳,似乎计算 bool 数组大约需要 10 毫秒,所以我不认为这是我的算法效率低下的问题,而是我推测缓慢是由于细胞所有更新几乎同时(触发属性更改事件,进而触发更改相应矩形的填充值的数据触发器)。
我是 C# 和 WPF 的新手,所以我不完全确定如何让它更快。有人告诉我,可以使用 Dispatcher 大大提高性能,但我不确定如何做到这一点。我也知道 BackgroundWorker 类,但不完全确定在这种情况下如何使用它。
最初我将 Cell 的 State 属性绑定到 Rectangle 的 Fill 属性,并使用 ValueConverter 将布尔值转换为颜色。有人建议 DataTriggers 可能更快,这是我目前正在使用的,但我并没有真正注意到任何性能改进。其他人还建议我应该使用 RectangleGeometry 和 Path 对象而不是 Rectangle 对象,因为它可能会提高图形性能,但不确定这是否准确,并且没有太多运气成功实现这一点。
无论如何,我能做些什么来提高我的应用程序的性能?