2012-03-28 6 views
10

Tôi đã đọc về điều này UpdateLayout() method trong MSDN.Có thể cho tôi một ví dụ khi sử dụng UIElement.UpdateLayout()?

Nó nói:

Đảm bảo rằng tất cả các yếu tố con hình ảnh của nguyên tố này là đúng cập nhật cho bố trí.

Nhưng tôi không hiểu ý nghĩa của bố cục không được cập nhật đúng cách.

Tôi đã làm việc với Silverlight/WPF trong hơn một năm, nhưng tôi vẫn chưa sử dụng phương pháp này một lần.

Vì vậy, ai đó có thể cho tôi một ví dụ yêu cầu sử dụng phương pháp này? Vì vậy, tôi thực sự có thể hiểu những gì nó làm và khi tôi nên sử dụng nó?

Trả lời

8

Bạn có thể muốn gọi này nếu bạn cần một kiểm soát để ngay lập tức hoàn thành bố trí của nó để bạn có thể làm một cái gì đó dựa trên đó.Ví dụ: bạn có thể gọi UpdateLayout trên điều khiển con để nó có được một số ActualHeightActualWidth, nếu bạn muốn làm điều gì khác dựa trên điều đó (ví dụ: đặt vị trí hoặc vẽ thứ gì đó có kích thước tương ứng).

+2

Ồ, như bạn đã nói nó thực sự hoạt động! Tôi đã cố gắng để tạo ra một Grid và một nút động. Nút 'ActualHeight/ActualWidth' chỉ có' ​​0,00' sau khi tôi thêm vào Grid, nhưng một khi tôi thực hiện 'UpdateLayout' nó mang lại cho tôi giá trị thực tế! Bây giờ tôi thấy những gì tôi có thể sử dụng cho, cảm ơn! +1 –

+2

+1 Chính xác những gì tôi đã thấy; sau khi gọi đến UpdateLayout(), ActualWidth đã có sẵn. – Sabuncu

+0

Một tình huống nữa tôi gặp phải hôm nay. Trong 'OnDropDownOpened' cho một combobox tùy chỉnh, tôi cần gọi' ItemContainerGenerator.ContainerFromItem', nhưng nó trả về null cho lần gọi đầu tiên, và chỉ làm việc tốt trong các cuộc gọi 'OnDropDownOpened' tiếp theo. Tôi đã phải thêm UpdateLayout() trước khi gọi 'ContainerFromItem', và sau đó nó bắt đầu làm việc cũng cho cuộc gọi đầu tiên. Tôi biết rằng giải pháp thay thế sẽ được tắt ảo hóa bằng cách sử dụng 'VirtualizingStackPanel' nhưng tôi không muốn làm điều đó vì lý do hiệu suất. – JustAMartin

0

Tôi nghĩ là được sử dụng nhiều nhất khi tạo điều khiển. Ví dụ: nếu trong mã bạn cảm thấy rằng một điều khiển mới được thêm vào hoặc một cái gì đó cụ thể xảy ra, bạn có thể gọi UpdateLayout này() để buộc bố cục lại các điều khiển. Trong một số trường hợp, WPF có thể xem xét rằng giao diện người dùng thay đổi đủ để nó tự gọi UpdateLayout của bạn(). Tất cả chúng ta đều mắc sai lầm ... nếu bạn tìm thấy một điều khiển nên "vẽ lại" hoặc "sắp xếp lại" các con của nó, bạn có thể cố buộc nó "làm mới" bằng cách gọi "UpdateLayout" của nó.

3

Từ nghiên cứu của tôi, UpdateLayout có vẻ là một cách rất mạnh mẽ để có được tất cả các điều khiển trên bố cục để cập nhật. Tuy nhiên, trong hầu hết các trường hợp, hệ thống bố cục đủ thông minh và đủ nhanh để tự cập nhật một cách thích hợp. Tất cả mọi thứ mà tôi đã đọc dẫn tôi tin rằng cuộc gọi này chỉ cần thiết nếu bạn đang thực hiện nhiều sửa đổi bố cục (thêm điều khiển và di chuyển chúng xung quanh) và bạn cần một kịch bản bố cục cụ thể được hiển thị trong khi phần còn lại của ngăn xếp cập nhật hoàn thành (tuy nhiên tôi vẫn chưa thấy một ví dụ tốt để hiển thị điều này ... thuật toán bố cục bình thường dường như chỉ là tốt). This MSDN article on layout sẽ giúp làm rõ mọi thứ.

Tuy nhiên, từ trên:

Phương pháp UpdateLayout buộc một bản cập nhật bố trí đệ quy, và là thường không cần thiết

this documentation

cuộc gọi thường xuyên để InvalidateArrange, hoặc đặc biệt là UpdateLayout, có những hậu quả đáng kể về hiệu suất nếu số lượng lớn của các phần tử tồn tại trong giao diện người dùng. Tránh gọi phương thức này trừ khi bạn hoàn toàn yêu cầu trạng thái bố cục chính xác cho các lệnh gọi tiếp theo đến các API khác trong mã của bạn.

Để kết thúc trả lời trực tiếp câu hỏi của bạn. Điều này chủ yếu được thực hiện theo cách riêng của mình với logic bố cục UI bên trong và bạn rất có thể sẽ không bao giờ cần sử dụng nó. Bởi trên, có vẻ như với tôi rằng nó sẽ là khá rõ ràng khi bạn cần phải sử dụng nó (và nó không phải cho luồng như nhiều, bao gồm cả bản thân mình đã nghĩ)

+0

hm ... Tôi vẫn không hiểu ví dụ của bạn. Tôi đã thử mã của bạn và giao diện người dùng sẽ không cập nhật sau khi gọi UpdateLayout() trước Thread.Sleep(), nó không tạo sự khác biệt nào khi gọi phương thức này hay không. –

+0

@KingChan Tôi đã cập nhật toàn bộ câu trả lời của mình. Sau nhiều nghiên cứu, có vẻ như những gì nó có vẻ và thậm chí những gì trong số đó có gì là sai. Đây là phương pháp chủ yếu để cập nhật toàn bộ canvas ... nhưng gần như không bao giờ cần thiết. –

+0

thansk cho nghiên cứu của bạn, vì vậy bây giờ tôi biết thực sự là khá bình thường mà chúng ta không cần phương pháp đó để sửa chữa bố cục nhiều. Cảm ơn. +1 –