用WPF绘制图像网格
|
我正在尝试使用WPF绘制图像/图标网格。网格尺寸会有所不同,但通常会在10x10到200x200之间。用户应该能够单击单元格,并且某些单元格每秒需要更新(更改图像)10-20次。网格应该能够在所有四个方向上增长和收缩,并且应该能够切换到它所表示的3D结构的不同“切片”。我的目标是在给定这些要求的情况下,找到一种合适的有效方法来绘制网格。
我当前的实现使用WPF
Grid
。我在运行时生成行和列定义,并在适当的行/列中用Line
(对于网格线)和Border
(对于单元格,因为它们当前只是打开/关闭)对象填充网格。 (“ 1”个对象贯穿整个对象。)
在扩展网格时(按住Num6键),我发现它绘制得太慢而无法在每个操作上重画,因此我对其进行了修改,只为增长的每一列简单地添加了新的ColumnDefinition
,Line
和set2ѭ对象集。这解决了我的成长问题,并且可以使用类似的策略来快速缩小。为了在仿真过程中更新单个单元格,我可以简单地存储对单元格对象的引用并更改显示的图像。通过仅更新单元格内容而不是重建整个网格,甚至可以更改为新的Z级别。
但是,在进行所有这些优化之前,我遇到了另一个问题。每当我将鼠标悬停在网格上时(即使是以低速/正常速度运行),应用程序的CPU使用率都会飙升。我从网格的子元素中删除了所有事件处理程序,但这没有任何效果。最后,唯一可以控制CPU使用率的方法是将ѭ0设置为ѭ7。 (为Grid
的每个子元素设置此设置均无济于事!)
我相信使用单独的控件来构建我的网格对于此应用程序来说过于繁琐且不合适,并且使用WPF的2D绘制机制可能会更高效。我是WPF的初学者,所以我正在寻求有关如何最好地实现这一目标的建议。从我所读的内容中,我可能会使用ѭ10来将每个单元格的图像组合到一个图像上进行显示。然后,我可以对整个图像使用click事件处理程序,并通过鼠标位置计算单击的单元格的坐标。不过,这似乎很混乱,我只是不知道是否有更好的方法。
有什么想法吗?
更新1:
我接受了朋友的建议,并切换为每个单元格使用Canvas
和Rectangle
。当我第一次绘制网格时,我将所有ѭ12的引用存储在一个二维数组中,然后在更新网格内容时,我只需访问这些引用即可。
private void UpdateGrid()
{
for (int x = simGrid.Bounds.Lower.X; x <= simGrid.Bounds.Upper.X; x++)
{
for (int y = simGrid.Bounds.Lower.Y; y <= simGrid.Bounds.Upper.Y; y++)
{
CellRectangles[x, y].Fill = simGrid[x, y, ZLevel] ? Brushes.Yellow : Brushes.White;
}
}
}
最初绘制网格的速度似乎更快,而后续更新的速度肯定更快,但是仍然存在一些问题。
无论我将鼠标悬停在多么小的区域上,当我将鼠标悬停在具有数百个单元的网格上时,CPU使用率仍然会飙升。
更新仍然太慢,因此当我按住向上箭头键更改Z级别(一种常见的用例)时,程序一次冻结几秒钟,然后似乎一次跳了50个Z级别。
一旦网格容纳约5000个单元,更新将花费一秒钟的时间。这太慢了,在典型的用例中可以容纳5000个单元。
我尚未尝试过“ 15”法,因为我认为它可能会遇到与我已经遇到的问题相同的问题。不过,一旦我用尽了更多的选择,就可以尝试一下。
没有找到相关结果
已邀请:
7 个回复
纫合峭
奖励了该问题。然后,您基本上将整个场景绘制在画布上。 使用DirectX进行绝对控制 另外,如果您想对每个帧进行绝对控制,请考虑使用原始DirectX。
骂陋冠
绵扇寸访
我可以在y笔记本电脑(而不是竞赛机...)上成功绘制并调整400x400网格的大小。 有更多更好的方法(在DrawingContext上使用StreamGeometry),但这至少是一个不错的测试工作台。 当然,您必须重写HitTestXXX方法。
翱抹村
,如下所示:
结果如下:
攫怂绵十
谦响局豢报
素汞读