2013-03-24 35 views
9

Tôi đang cố tạo một đại diện trực quan của bất kỳ thuật toán phân loại nào mà dữ liệu được biểu diễn trong một mảng int []. Một ví dụ về bong bóng sắp xếp trên wikipedia:Làm cách nào để làm mới canvas

Bubble sort from wikipedia

thuật toán sắp xếp của tôi tất cả huy động một sự kiện ItemsSwapped khi hai mục trong int [] mảng được hoán đổi. Tôi đang cố gắng hiển thị dữ liệu sau mỗi sự kiện trên canvas, đây là mã của tôi:

// Handler for ItemsSwapped event. 
private void Render(object sender, ItemsSwapEventArgs e) 
{ 
    canvas.Children.Clear(); 
    int numberOfElements = e.Data.Length; 

    for (int x = 0; x < numberOfElements; x++) 
    { 
     RenderValue(x, e.Data[x]); 
    } 
    // Here I should somehow refresh canvas. 
} 

private void RenderValue(int x, int y) 
{ 
    var value = new Ellipse 
        { 
         Width = 5, 
         Height = 5, 
         Stroke = Brushes.Black, 
         StrokeThickness = 2, 
        }; 
    Canvas.SetTop(value, x); 
    Canvas.SetLeft(value, y); 
    canvas.Children.Add(value); 
} 

Vấn đề là, canvas không tự làm mới, nó chỉ hiển thị giải pháp cuối cùng sau một thời gian. Làm thế nào tôi có thể làm mới nó sau mỗi sự kiện lớn lên?

Chỉnh sửa - Tôi đã thử với đối tượng UpdateLayout, InvalidateMeasure và Dispatcher, nhưng không hoạt động.

Trả lời

2

Có thể bạn bắt đầu thuật toán sắp xếp của mình trên chuỗi giao diện người dùng, vì vậy nó sẽ không cập nhật cho đến khi hoàn tất. Thử phân loại trong một chuỗi khác và cập nhật trẻ em Canvas bằng cách sử dụng Dispatcher, bằng cách gọi Invoke hoặc BeginInvoke.

Nếu handler ItemsSwapped của bạn được gọi từ một thread riêng biệt, nó có thể trông như thế này:

private void Render(object sender, ItemsSwapEventArgs e) 
{ 
    Dispatcher.Invoke((Action)(() => 
     { 
      canvas.Children.Clear(); 
      int numberOfElements = e.Data.Length; 

      for (int x = 0; x < numberOfElements; x++) 
      { 
       RenderValue(x, e.Data[x]); 
      } 
     })); 
} 
2

Bạn đang sử dụng chủ đề? Bạn phải thực hiện công việc của mình trong một chuỗi riêng biệt từ giao diện người dùng chính. Đây là liên kết để bạn bắt đầu: How to update the GUI from another thread in C#?