2010-12-29 26 views
10

Làm cách nào để tạm ngưng và tiếp tục bố cục trong WPF? Tôi nghe nói rằng điều này là không cần thiết. Nhưng điều này là cực kỳ cần thiết!Làm cách nào để tạm ngưng và tiếp tục bố cục trong WPF?

Tôi xử lý nhiều vị trí thay đổi và nếu chúng được hiển thị từng cái một, nó sẽ tạo ra hiệu ứng chậm trễ.

Dưới đây là một số mã:

 

CompositionTarget.Rendering += new EventHandler(Draw); 
void Draw(object sender, EventArgs e) 
{ 
    //Clean screen 
    for (int i = mainCanvas.Children.Count - 1; i > -1; i--) 
    { 
    if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image) 
    { 
      mainCanvas.Children.Remove(mainCanvas.Children[i]); 
    } 
    } 
    //DRAW FLOOR AROUND 
    FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id); 
    for... 
    { 
     Image image = new Image(); 
     image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative)); 
     mainCanvas.Children.Add(image); 
    } 

    //DRAW PLAYERS AROUND 
    //Its similar as draw floors around. 
    ... 
} 
 
+3

@Alan, trước khi bạn tìm kiếm thợ săn tiền thưởng, hãy dành chút thời gian để thêm thông tin cho câu hỏi của bạn. Ai đó có thể đưa ra một giải pháp tốt hơn. Bạn sẽ phải thêm nó ngay cả cho thợ săn tiền thưởng! :) – decyclone

+4

@Alan Vấn đề của bạn không phải là thiếu tiền thưởng, thiếu chi tiết trong câu hỏi. Ấn tượng của tôi là giải pháp của bạn (tạm ngưng bố cục) không phải là những gì bạn thực sự muốn, vì vậy mọi người cần thêm chi tiết để tìm gốc của vấn đề của bạn. – CodesInChaos

+0

Rất đơn giản, tôi đã mô tả nó. Đối với game thủ này thậm chí còn đơn giản hơn. – Seva

Trả lời

7

Bạn chưa có đủ thông tin ngoại trừ việc nói rằng bạn "xử lý có nhiều thay đổi". Nhưng nếu bạn thực hiện tất cả những thay đổi đó:

  • tuần tự
  • từ thread UI
  • mà không gọi UpdateLayout, và
  • mà không trả lại

sau đó không bố trí xảy ra trong bewteen những thay đổi . Do đó không có gì để tạm ngưng hoặc tiếp tục vì bố cục luôn được trì hoãn cho đến sau khi bạn quay trở lại từ việc thực hiện các loại thay đổi này.

Vì vậy, nếu bạn gặp phải sự chậm trễ, thì không phải vì bạn không thực hiện thay đổi bố cục của mình cho ala WinForms. Kết quả là, cách duy nhất để giảm độ trễ, nếu nó thực sự là do bố cục, là tránh tính toán lại bố cục không cần thiết. Một lần nữa, không biết bạn đang làm gì, không thể đề xuất bất cứ điều gì cụ thể. Nhưng có nhiều thuộc tính bạn có thể tránh để có thể kích hoạt một đường dẫn bố trí đệ quy. Xem Performance Layout cân nhắc trong bài viết này:

+0

Tôi đã thêm mã ngay bây giờ. Nếu bạn có thể thấy, cảm ơn bạn. – Seva

+0

Bạn có thể nhận được hiệu suất tốt với các phần tử WPF như sprites, và thậm chí bạn có thể thay đổi vị trí của chúng trên mỗi render để có tốc độ khung hình nhanh nhất có thể. Bạn chỉ cần sử dụng lại các phần tử từ frame-to-frame và điều chỉnh vị trí của chúng bằng cách thay đổi các trường của biến đổi kết xuất, chứ không phải tạo lại chúng từ đầu mỗi chu kỳ. –

+0

Trong trò chơi phát triển, chúng tôi không sử dụng kỹ thuật này, bởi vì rất khó để biết được đối tượng nào biến mất của cửa sổ. – Seva

13

WPF là một công cụ giữ thành phần. Điều đó có nghĩa là bạn không phải tự mình dựng hình sự kiện Rendering, nhưng thay vì soạn một hình ảnh bằng cách sử dụng các nút mà bạn sẽ đặt trong một cây. Xem tại đây để biết chi tiết về kiến ​​trúc WPF: WPF Architecture. Tôi có thể đảm bảo với bạn nếu bạn hiểu hoàn toàn tài liệu này cũng như liên kết Hệ thống Bố cục mà Rick Sladkey đã gửi, bạn cũng nên hiểu tại sao bạn nên thay đổi mã của mình nếu bạn muốn tiếp tục với WPF.

Nếu bạn chơi đúng với WPF (ví dụ: sử dụng thuộc tính phụ thuộc, ghi đè số & Sắp xếp các phương pháp), bạn sẽ thấy đó là một công cụ rất mạnh mẽ có khả năng hiển thị hàng nghìn nút trong cây đồ họa. Tôi đề xuất một bài đọc hữu ích khác: ZoomableApplication2: A Million Items

0

Bạn đã cân nhắc xóa canvas khỏi cửa sổ trước tiên sẽ ẩn nó, sau đó xóa và thêm lại tất cả các mục vào canvas, sau đó thêm lại canvas vào cửa sổ?

+0

Tôi đã thử, cũng không hoạt động. – Seva

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