2013-01-24 37 views
9

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

+0

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

Trả lời

10

Dường như với tôi như bạn cần bật tính năng ảo hóa trong TreeView.

Từ Optimizing Performance: Controls:

Theo mặc định, giao diện người dùng ảo hóa được kích hoạt cho ListView và ListBox điều khiển khi mục danh sách của họ đang bị ràng buộc dữ liệu. TreeView ảo hóa có thể được kích hoạt bằng cách thiết lập VirtualizingStackPanel :: IsVirtualizing tài sản gắn liền với thực

+0

Trong trường hợp của tôi là VirtualizingPanel.IsVirtualizing thay vì VirtualizingStackPanel :: IsVirtualizing – Yogesh

+2

liên kết đã chết .. cập nhật https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-controls –

1

Vấn đề của bạn có thể sẽ không render nhưng bố trí - nó có để nhanh chóng rất nhiều yếu tố giao diện người dùng để tìm ra kích thước của chúng để nó đúng cách có thể kích thước một số yếu tố giao diện người dùng (thanh trượt), và điều này cần có thời gian. Khả năng hiển thị không được nhập vào điều này chút nào.

+0

Đây có phải chỉ là một hạn chế của kiểm soát treeview sau đó? Như tất cả những gì tôi đang làm là thêm các nút con trống và vẫn mất một lượng thời gian hợp lý. Hàng thứ hai bắt đầu bao gồm các hình ảnh biểu tượng nhỏ, gần như không sử dụng được. Tôi có thể sử dụng những thủ thuật nào để thực hiện điều này nhanh hơn? – NZJames

3

Nếu một TreeView chứa nhiều mặt hàng, số lượng thời gian cần để tải có thể gây ra một sự chậm trễ đáng kể trong giao diện người dùng . Bạn có thể cải thiện thời gian tải bằng cách đặt thuộc tính VirtualizingStackPanel.IsVirtualizing đính kèm thành true.Giao diện người dùng cũng có thể phản ứng chậm khi người dùng cuộn TreeView bằng cách sử dụng bánh xe chuột hoặc kéo ngón tay cái của thanh cuộn. Bạn có thể cải thiện hiệu suất của TreeView khi người dùng cuộn bằng cách thiết lập thuộc tính đính kèm VirtualizingStackPanel.VirtualizationMode để Tái chế.

How to: Improve the Performance of a TreeView

XAML:

<TreeView Height="200" ItemsSource="{Binding Source={StaticResource dataItems}}" x:Name="myTreeView" 
     VirtualizingStackPanel.IsVirtualizing="True" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"/> 

lập trình:

myTreeView.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, true); 
myTreeView.SetValue(VirtualizingStackPanel.VirtualizationModeProperty, VirtualizationMode.Recycling) 
Các vấn đề liên quan