2009-10-16 36 views
6

Tôi đã thêm một chút hoạt ảnh vào ứng dụng WPF của mình.WPF - Sắp xếp sự kiện bố cục được lặp lại

Nhờ Dan Crevier's unique solution to animating the children of a panel kết hợp với awesome WPF Penner animations hóa ra là khá đơn giản để làm cho một trong các điều khiển của tôi trông tuyệt vời và giúp con bạn di chuyển với một số hoạt ảnh đẹp.

Thật không may tất cả điều này đi kèm với chi phí hoạt động. Tôi rất vui khi có hiệu suất khi các mục được thêm/xóa hoặc điều khiển được thay đổi kích thước, nhưng có vẻ như lần truy cập này xảy ra nhất quán trong suốt thời gian của ứng dụng, ngay cả khi các mục hoàn toàn tĩnh.

Lớp PanelLayoutAnimator sử dụng thuộc tính được đính kèm để móc sự kiện UIElement.LayoutUpdated. Khi sự kiện này kích hoạt, các biến đổi hiển thị sẽ được làm động để khiến trẻ em lướt qua vị trí mới của chúng.

Thật không may có vẻ như sự kiện LayoutUpdated kích hoạt mỗi giây hoặc lâu hơn, ngay cả khi không có gì xảy ra trong ứng dụng (ít nhất tôi không nghĩ mã của mình đang làm gì cả - ứng dụng này không tập trung và chuột ổn định.) Vì lý do cho sự kiện này không rõ ràng đối với người xử lý sự kiện, tất cả trẻ em của kiểm soát phải được đánh giá lại. Sự kiện này đang được gọi khoảng một lần một giây khi không hoạt động. Tần suất tăng khi thực sự sử dụng ứng dụng.

Vì vậy, câu hỏi của tôi là, làm cách nào để cải thiện hiệu suất tại đây? Bất kỳ câu trả lời nào hỗ trợ sẽ được đánh giá cao, nhưng tôi hiện đang bị mắc kẹt vào các câu hỏi phụ sau:

  1. Điều gì gây ra sự kiện LayoutUpdated để kích hoạt thường xuyên? Chuyện này có xảy ra không, và nếu không, làm thế nào tôi có thể tìm ra lý do tại sao nó bắn và cắt nó?

  2. Có cách nào thuận tiện hơn trong trình xử lý để biết liệu có điều gì đó đã xảy ra có thể đã di chuyển trẻ em không? Nếu vậy, tôi có thể bảo lãnh sớm và tránh phí tổn của việc lặp lại từng đứa trẻ.

Để bây giờ tôi sẽ làm việc xung quanh vấn đề này bằng cách vô hiệu hóa hình ảnh động khi có hơn N trẻ em trong bảng điều khiển.

+0

Drew, bạn có thể vui lòng chia sẻ mẫu mã nhỏ mà có thể tạo lại vấn đề? – Anvaka

+0

Vâng, vì LayoutUpdated nên thực sự chỉ được kích hoạt nếu một cái gì đó thực sự khiến bố cục cập nhật ... hiển nhiên như âm thanh đó. :) Vì bạn không tương tác với Cửa sổ, tôi không biết điều gì sẽ kích hoạt tính năng này ngoài ảnh động đến kích thước, vị trí hoặc chuyển đổi bố cục. –

+0

Hmm ứng dụng khá lớn. Nếu LayoutUpdated không được kích hoạt thường xuyên, thì tôi có thể sử dụng kỹ thuật nào để tìm hiểu lý do tại sao nó được kích hoạt? –

Trả lời

7

Nếu bạn đang cập nhật giao diện người dùng từ EventHandler bạn đã đính kèm vào sự kiện LayoutUpdated, điều này cũng sẽ kích hoạt sự kiện đó!

Ví dụ:

void my_LayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     textBlock1.Text = "changed"; 
     Console.Out.WriteLine("text changed!"); 
    } 

sẽ đi vào một vòng lặp vô hạn của bản cập nhật.

Có lẽ bạn cần phải làm điều gì đó như thế này:

void my_BetterLayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     if (!hasChanged) 
      textBlock1.Text = "changed"; 
     hasChanged = true; 
     Console.Out.WriteLine("text changed!"); 
    } 
+2

Điểm thú vị và nó tạo ra giác quan. Tôi không còn làm việc trên ứng dụng đó, nhưng điều này nghe có vẻ hợp lý. Hy vọng nó giúp người khác ra ngoài. –

+0

Có thể kiểm tra giao diện người dùng nào đang cập nhật gây ra việc vô hiệu không? – simo

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