Tôi đang cố gắng cải thiện hiệu suất của treeview trong WPF, khi bạn mở một nút với 6000 trẻ em, mất khoảng 13 giây để hiển thị điều này. Tôi đang sử dụng một observablecollection cho bộ sưu tập con, với một datatemplate ràng buộc với các loại TransactionViewModel trong đó có khoảng 7 cột, mỗi kéo trong một mảnh dữ liệu từ mô hình xem.WPF render hiệu suất chậm
Mô hình giao dịch cho 6000 trẻ được tạo và khởi tạo, nhưng vì bạn chưa hiển thị bất kỳ biểu tượng nào trong số chúng trực quan, lần đầu tiên bạn mở rộng nút, mất 13 giây để hiển thị. nếu bạn sau đó hợp đồng và mở rộng nút, nó sẽ hiển thị ngay lập tức với thời gian không để hiển thị/tải. Sự khác biệt duy nhất tôi có thể thấy là lần đầu tiên mỗi thuộc tính phụ thuộc ràng buộc của TransactionviewModel có getter được gọi là bởi ràng buộc XAML, và khi bạn mở rộng lần thứ hai, không cái nào xảy ra vì không có gì thay đổi nên WPF không gọi getters một lần nữa và có lẽ chỉ giữ thông tin bị ràng buộc trong bộ nhớ khi bạn mở rộng nó lần thứ hai. Vì vậy, bản vẽ trực quan của điều khiển là ngay lập tức, nhưng lần đầu tiên bạn mở nó (mặc dù 6000 đối tượng transactionviewmodel đã được nạp đầy đủ vào bộ sưu tập con), hoàn toàn là việc hiển thị các hàng là thời gian.
Thật thú vị nếu tôi thay đổi bảng dữ liệu để không liên kết với bất kỳ thuộc tính phụ thuộc nào trên đối tượng viewmodel và chỉ cần xuất ra một lưới trống, nó vẫn mất 8 giây để tải. Vì vậy, ngay cả khi không có bất kỳ cuộc gọi ràng buộc dữ liệu nào, trình xem cây mất 8 giây để hiển thị 6000 hàng. Thêm 5 giây sau đó cung cấp cho bạn khoảng 5 cột dữ liệu bị ràng buộc trên mỗi hàng, do đó, đó là một chi phí nhỏ so với hiển thị cơ bản.
8 giây để hiển thị 6000 hàng trống có vẻ rất cao đối với tôi. Có bất kỳ lý do chính nào tại sao điều này có thể xảy ra hoặc những điều cần lưu ý trong việc hiển thị XAML vào một số lần xem trang từ các mẫu dữ liệu không? Ive đã thử chỉ sử dụng một datatemplate trống - tức là thậm chí không một lưới trống bên trong nó và nó vẫn mất 7 giây.
Vì nó sau đó sụp đổ và mở rộng ngay lập tức, tại sao nó mất quá lâu lần đầu tiên khi nó thậm chí không hiển thị bất kỳ XAML hoặc gọi bất kỳ ràng buộc dữ liệu?
Ngoài ra các cuộc gọi asynch không phải là giải pháp vì vấn đề của tôi không phải là giao diện GUI nhưng thời gian thực hiện để tải dữ liệu. Người dùng cần phải có dữ liệu nhanh hơn so với họ đang nhận được nó ngay bây giờ.
Rất cám ơn
Bạn có sử dụng ảo hóa? WPF không làm chậm khi bạn bắt đầu hiển thị hàng nghìn đối tượng giao diện người dùng, vì vậy thông thường bạn chỉ muốn hiển thị các mục hiển thị, không phải tất cả, và chỉ cần thay thế DataContext sau các điều khiển khi bạn cuộn. Tôi cũng sẽ kiểm tra kỹ để đảm bảo rằng giao diện người dùng gây ra sự chậm trễ và không tải dữ liệu. – Rachel