2011-06-21 30 views
5

Một câu hỏi hai hướng ở đây, nhưng tôi nghĩ rằng hai chủ đề này được gắn chặt đủ để đảm bảo sự hòa nhập của chúng với nhau.Làm cách nào để tăng tốc độ hiển thị ListBox và lọc ListCollectionView?

Trong đơn đăng ký của chúng tôi, chúng tôi có một số ListBox, được điền bằng số lượng lớn mặt hàng. Mỗi mục trong số các mục này được hiển thị với một mẫu mục khá phức tạp. Nó nhất thiết khá phức tạp, và trong khi nó có khả năng có thể được pared xuống nhiều hơn một chút tôi có lẽ không thể mất một số tiền lớn ra. Các mục trong số ListBox đến từ một số ListCollectionView được tạo từ một số ObservableCollection<> của các đối tượng cần hiển thị.

Chúng tôi có hai vấn đề.

Đầu tiên là khi chúng ta cấu hình lại bộ lọc cho ListCollectionView và gọi Refresh trên đó, có một rất đáng chú ý khóa-up của một vài giây trong UI trong khi nó bị rách xuống và tái tạo, và ListBox phục hồi lại. Thời gian khóa này có vẻ liên quan đến số lượng các phần tử có trong số ListBox và dài nhất khi khu vực khách hàng của ListBox có đầy đủ các mục. Chúng tôi khá chắc chắn rằng việc khóa lại là do các mẫu mục được tạo lại. Tôi đã thử bật ảo hóa, nhưng điều này không có tác dụng trong việc giảm hoặc loại bỏ sự chậm lại. Tôi cũng đang xem xét một số tối ưu hóa khác, như kiểm tra các ràng buộc của chúng ta và sửa đổi các bố trí. Có phương pháp nào để tránh vấn đề cụ thể này, tăng tốc nó hay chuyển nó sang một chủ đề khác không? (Tôi biết người cuối cùng không chắc chắn vì việc hiển thị là tất cả các luồng đơn, nhưng có lẽ có một số cách giải quyết ...)

Thứ hai liên quan đến việc lọc trên ListCollectionView. Mặc dù đây không phải là vấn đề, chúng tôi nghĩ rằng có khả năng lọc để trở thành vấn đề và gây ra sự khóa đáng chú ý trên chuỗi giao diện người dùng. Tôi đang làm việc để giảm chi phí lọc, nhưng tôi đã tự hỏi nếu có một phương pháp để di chuyển các Làm mới cuộc gọi trên ListCollectionView vào một chủ đề khác nhau? Không có nỗ lực nào của tôi cho đến nay đã thành công, dường như vì ListCollectionView không tự động sắp xếp một số sự kiện nhất định vào đúng chuỗi.

Con trỏ đến hoặc giải thích về bất kỳ giải pháp đã biết hoặc tiềm năng nào cho hai vấn đề này sẽ rất hữu ích.

+0

Tôi có cùng vấn đề với dự án wpf của mình. Bạn đã tìm thấy một giải pháp ? –

+0

Đã lâu rồi :) Tôi dường như nhớ rằng chúng tôi đã thực sự tối ưu hóa mẫu, và tái cấu trúc bộ lọc để di chuyển phần lớn nó vào một chủ đề khác. Điều đó làm cho việc khóa lên ít đáng chú ý hơn nhiều. Thật không may, tôi đã thay đổi công việc kể từ đó, vì vậy tôi không biết nếu có thêm công việc nào được thực hiện. Có thể họ đã chuyển sang một điều khiển giống như 'ListBox' của bên thứ ba hoạt động tốt hơn - chúng tôi đã làm điều đó cho lưới của chúng tôi. –

Trả lời

1

2 lời khuyên từ here, người đầu tiên có thể giúp cho việc ảo hóa các ListBox:

danh sách ảo hóa và quan điểm bằng cách sử dụng một VirtualizingStackPanel như ItemsPanel cho các danh sách. Điều này chỉ tạo ra các phần tử hiển thị tại thời gian tải. Tất cả các yếu tố khác được tạo ra lười biếng khi chúng hiển thị. Hãy lưu ý rằng việc nhóm hoặc CanContentScroll="True" ngăn việc ảo hóa!

Bật tái chế vùng chứa. Ảo hóa mang lại rất nhiều cải tiến hiệu suất, nhưng các thùng chứa sẽ được xử lý và tạo lại, đây là mặc định. Nhưng bạn có thể đạt được hiệu suất hơn bằng container tái chế bằng cách thiết lập VirtualizingStackPanel.VirtualizationMode="Recycling"

tôi đã ảo hóa danh sách khổng lồ của tôi về đối tượng bằng các kỹ thuật được mô tả here on codeproject, nó hoạt động độc đáo

+0

Đó là một bài viết thú vị. Nó có thể hữu ích khi chúng ta đọc trong các đối tượng xuất hiện trong ListBox; Tôi sẽ xem xét việc triển khai nó. Về VirtualizingStackPanel: Tôi đã thiết lập nó, nhưng thật không may, nó đã không giải quyết các gian hàng ListBox. Cảm ơn, mặc dù. –

+0

Áp phích gốc có một câu hỏi hợp lệ liên quan đến ListCollectionView và đã bật ảo hóa. Tôi đang chạy vào cùng một vấn đề này: Làm mới xuất hiện để tạo lại các mục. Tôi đã xác nhận rằng ảo hóa đang làm việc bằng cách cuộn, nhưng khi tôi lọc hoặc sắp xếp bằng cách sử dụng khung nhìn, WPF đã tạo lại tất cả các mục trong ListView. –

2

Một số ý tưởng thú vị trong this thread SO về vẽ DataGrid và ràng buộc - bạn cũng có thể áp dụng chúng cho kịch bản hộp danh sách của bạn ...

+0

Tôi nghĩ đây có thể là giải pháp tiềm năng nếu chúng tôi thêm hoặc xóa các mục. Khi áp dụng một bộ lọc mặc dù, có vẻ như là ListBox phải được repopulated. Nếu nó là không thể tránh khỏi, sau đó là gian hàng đi kèm với nó, mà là hơi khó chịu. Một triệu chứng của hiển thị ren đơn của WPF. Hy vọng rằng, sẽ có một số biện pháp khắc phục cho nó trong tương lai. Trong thời gian này, tôi đoán tôi sẽ phải cố gắng tối ưu hóa DataTemplate của chúng tôi một số chi tiết. Chúc mừng. –

2

Tôi không nghĩ rằng bạn có thể ảo hóa và lọc cùng một lúc. Vì vậy, nếu tôi đã ở trong giày của bạn, tôi sẽ gắn bó với một hộp danh sách ảo hóa và làm logic lọc trong một chủ đề khác.Chắc chắn, bạn có thể phải viết một số mã đã được viết trước đó, nhưng nếu nó không khóa GUI của bạn? Đáng giá.

Các vấn đề liên quan