2009-09-07 12 views
32

Tôi muốn có một mô tả đơn giản về cách triển khai virtualizingstackpanel cho số ItemsControl được chuyển thành số ObservableCollection trong MVVM của tôi.WPF VirtualizingStackPanel để tăng hiệu suất

Tôi có một phiên bản ItemsControl cho mỗi tab trong điều khiển tab và chuyển đổi tab trở thành RẤT chậm khi số ItemsControl tăng lên lớn hơn.

Tôi có thể làm gì để tăng tốc ứng dụng?

Tôi đã mở một hồ sơ WPF và thấy rằng mỗi phần tử (là một điều khiển người dùng tùy chỉnh) được hiển thị trong ItemsControl của mỗi tab có ContentPresenter riêng. Vì vậy, về cơ bản tôi có 100 người thuyết trình nội dung đang chạy 100 mục trong số ObservableCollection trong MVVM của tôi. Điều này có đúng không? Làm cách nào tôi có thể tối ưu hóa?

Trả lời

48

Có hai kỹ thuật có thể giúp ích rất nhiều. Cả hai đều được mô tả rất tốt bởi Bea Stolnitz trên blog của cô.

Đầu tiên là UI Virtualization và thứ hai là Data Virtualization

Trong ảo hóa UI bạn sử dụng những thứ như VirtualizingStackPanel để làm cho giao diện người dùng rút ra những điều ít.

ảo hóa dữ liệu đảm bảo bạn không mang lại một triệu đối tượng vào bộ nhớ khi bạn đang chỉ sẽ hiển thị 100.

ảo Vì vậy, giao diện người dùng giảm thiểu số điều rút ra và dữ liệu ảo hóa giúp giảm thiểu số lượng những điều mà có thể được rút ra.

Hy vọng rằng sẽ giúp

9

Tôi đã có cùng một vấn đề trong WPF bằng TabControl và DataGrid. Bằng cách tăng kích thước phần tử DataGrid, các tab chuyển đổi trở nên rất chậm! Sau đó tôi tìm thấy bài viết này đọc blog từ Bea Stolnitz như được cho là bởi câu trả lời trước đó. Điều đó đã cho tôi những gợi ý để google "WPF TabControl VirtualizingStackPanel" mà mang lại cho tôi liên kết để DrWPF: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

Ông mô tả chính xác vấn đề và đưa ra các giải pháp :-))

.... Các Perf hit là trong quá trình xây dựng cây. Thật không may, nếu
bạn đang sử dụng một cách tiếp cận MVVM điển hình với một ràng buộc đối với các ItemsSource
tài sản của TabControl, toàn bộ cây phải được xây dựng lại mỗi lần
một mục tab được chọn. Đây thường là một hoạt động rất tốn kém. ....