Trong một giao diện người dùng WPF Tôi có nút nối với nhau bằng những con đường Bút chì, như vậy:WPF PathGeometry cập nhật _SLOW_
Khi người dùng kéo một nút xung quanh, các đường dẫn kết nối cần phải được cập nhật trong gian thực thời gian. Tuy nhiên, tôi đã nhận thấy một số chậm lại (đặc biệt là nếu một nút được kết nối với nhiều nút khác, hoặc nhiều nút đang được kéo cùng một lúc). Tôi cấu hình nó, và vấn đề chính dường như là ở đây:
Đây là chức năng đó được gọi là mỗi lần một trong hai nguồn hoặc đích sở hữu được thay đổi. Hình học tạo nên đường dẫn dường như đang được tái tạo bên trong mỗi khi bất kỳ điểm điều khiển nào thay đổi. Có lẽ nếu có một cách để ngăn chặn hình học được tái tạo cho đến sau khi tất cả các thuộc tính phụ thuộc có liên quan đã được thiết lập?
CHỈNH SỬA: Giải pháp của Mart để sử dụng StreamGeometry tăng tốc theo cấp số nhân; chức năng là hư không gần với một nút cổ chai. Một chút Phản ánh cho thấy rằng PathGeometry sử dụng StreamGeometry nội bộ, và mỗi khi bất kỳ thuộc tính phụ thuộc nào được thay đổi, StreamGeometry được tính toán lại. Vì vậy, cách này chỉ cắt giảm trung gian. Kết quả cuối cùng là:
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);
}
}
Mã nguồn đầy đủ của dự án có sẵn tại http://zeal.codeplex.com cho tò mò.
Cảm ơn; chuyển sang StreamGeometry dường như để giải quyết vấn đề! –