在 WPF UI 中,我有通过贝塞尔路径连接的节点,如下所示:
当用户拖动一个节点时,连接路径需要实时更新。但是,我注意到一些速度变慢(特别是如果一个节点连接到许多其他节点,或者同时拖动多个节点)。我对其进行了分析,主要问题似乎在这里:
这是每次更改源或目标属性时调用的函数。每当任何控制点发生变化时,构成路径的几何图形似乎都会在内部重新生成。也许如果有一种方法可以防止重新生成几何体,直到设置了所有相关的依赖属性?
编辑: Mart 使用 StreamGeometry 的解决方案以指数方式加速它;该功能远未接近瓶颈。一点反射表明 PathGeometry 在内部使用 StreamGeometry,每次更改任何依赖属性时,都会重新计算 StreamGeometry。所以这种方式只是切断了中间人。最终结果是:
private void onRouteChanged()
{
Point src = Source;
Point dst = Destination;
if (!src.X.isValid() || !src.Y.isValid() || !dst.X.isValid() || !dst.Y.isValid())
{
_shouldDraw = false;
return;
}
/*
* The control points are all laid out along midpoint lines, something like this:
*
* --------------------------------
* | | | |
* | SRC | CP1 | |
* | | | |
* --------------------------------
* | | | |
* | | MID | |
* | | | |
* -------------------------------
* | | | |
* | | CP2 | DST |
* | | | |
* --------------------------------
*
* This causes it to be horizontal at the endpoints and vertical
* at the midpoint.
*/
double mx = (src.X + dst.X) / 2;
double my = (src.Y + dst.Y) / 2;
Point mid = new Point(mx, my);
Point cp1 = new Point(mx, src.Y);
Point cp2 = new Point(mx, dst.Y);
_geometry.Clear();
_shouldDraw = true;
using(StreamGeometryContext ctx = _geometry.Open())
{
ctx.BeginFigure(src, false, false);
ctx.QuadraticBezierTo(cp1, mid, true, false);
ctx.QuadraticBezierTo(cp2, dst, true, false);
}
}
该项目的完整源代码可在http://zeal.codeplex.com获得,供好奇者使用。