在WPF UI我具有由貝塞爾路徑連接的節點,例如:WPF的PathGeometry更新是_SLOW_
當用戶拖動周圍的節點,連接路徑需要實被更新時間。但是,我注意到一些減速(特別是如果一個節點連接到其他許多節點,或者多個節點一次被拖動)。我異形它,主要問題似乎是在這裏:
這是每個源或目標屬性改變時調用的函數。每當任何控制點發生變化時,組成路徑的幾何圖形似乎都會在內部重新生成。也許如果在所有相關的依賴項屬性設置完成之前,有一種方法可以防止幾何體被重新生成?
編輯:沃爾瑪的解決方案使用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爲好奇。
謝謝;切換到StreamGeometry似乎解決了問題! – 2010-07-07 15:36:40