2010-02-26 35 views
10

Tôi hiện đang làm việc trên một chương trình sử dụng cấu trúc phức tạp của các điều khiển biểu mẫu lồng nhau thay đổi động khi người dùng thực hiện các lựa chọn nhất định. Để đi vào chi tiết hơn về bố cục cụ thể của các điều khiển sẽ được mở rộng cho câu hỏi này.Làm cách nào để khắc phục các vấn đề nhấp nháy kiểm soát dạng lồng nhau

Khi bao giờ lựa chọn được thực hiện, rất nhiều cập nhật được thực hiện cho mô hình cơ bản được kiểm soát bởi các điều khiển người dùng. Điều này sau đó dẫn đến hàng loạt các thay đổi tương ứng về kích thước/vị trí/khả năng hiển thị của các điều khiển được hiển thị. Tất cả những thay đổi này dẫn đến một nhấp nháy dữ dội trên các điều khiển trên màn hình. Tôi cần phải bằng cách nào đó sửa lỗi này để mỗi khi người dùng thực hiện một lựa chọn màn hình về cơ bản là đóng băng cho đến khi tất cả các cập nhật kiểm soát đã hoàn thành.

Tôi đã cố gắng sử dụng các phương thức Control.SuspendLayout/Control.ResumeLayout ở nhiều nơi và cách khác nhau và tôi không thể loại bỏ sự nhấp nháy điên rồ. Tôi nghĩ rằng đình chỉ bố trí trên kiểm soát root trong những thay đổi sẽ khắc phục được vấn đề nhưng nó xuất hiện rằng SuspendLayout này không giúp đỡ khi điều khiển con được thay đổi.

Tôi có cần sử dụng một số cách tiếp cận khác thay vì SuspendLayout không? Có cách nào tôi có thể gỡ lỗi SuspendLayout để xem lý do tại sao nó không xuất hiện để được xếp tầng cho tất cả các điều khiển con?

+0

câu trả lời này phù hợp với tôi http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children – wal

Trả lời

0

Sử dụng SetControlStyles trong điều khiển người dùng, cờ là OptimizedDoubleBuffer sẽ chặn nhấp nháy.

2

Ngoài đề xuất của @ tommieb75 về đệm đôi, bạn có thể thử và xem các điều khiển cấp gốc của mình có các cặp phương thức BeginUpdate/EndUpdate hay không. Những điều này sẽ giúp ngăn chặn các repaints ở giữa các cuộc gọi.

+1

Một cặp phương pháp khác cần lưu ý là 'SuspendLayout() 'và' ResumeLayout() 'sẽ tạm dừng/tiếp tục vẽ của điều khiển – STW

0

Nếu bạn đang sử dụng WinForms 2+ thì bạn chỉ có thể đặt 'Điều khiển. DoubleBuffer 'tài sản trên sự kiểm soát để đúng (ngay cả trong các nhà thiết kế).

Với khung công tác 2, đặt DoubleBuffered đặt 3 cờ: OptimizedDoubleBuffer, AllPaintingInWmPaint và một thứ khác mà tôi đã quên, 'UserPaint' có lẽ.

Ngoài ra, hãy xem BeginUpdate/EndUpdate như đã đề cập bởi @yetapb.

14

Tạm dừng/tiếp tụcLưu ý không phải là vấn đề của bạn ở đây. Điều đó chỉ tạm dừng bố cục tự động, loại được kích hoạt bởi thuộc tính Anchor và Dock. Bộ đệm đôi không thể khắc phục được sự cố của bạn, mà chỉ ngăn chặn nhấp nháy trong từng điều khiển riêng lẻ. Vấn đề thực sự của bạn là bạn đang cập nhật quá nhiều điều khiển cùng một lúc, mỗi lần lượt sẽ tự vẽ và mất thời gian.

Điều bạn cần là một kiểu đệm đôi khác, tổng hợp. Kiểm tra xem giải pháp trong số this thread có giải quyết được vấn đề của bạn hay không.

+1

Yay, một cách phụ :) Hy vọng tôi nhớ nó khi tôi cần nó. –

+0

+1 bạn đã lưu ngày của tôi (mặc dù vào cuối đêm ...) – karlipoppins

+0

Cảm ơn .. đã lưu thời gian của tôi =) – Emo

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