2013-03-24 9 views
9

मैं किसी भी सॉर्टिंग एल्गोरिदम का दृश्य प्रस्तुतिकरण बनाने की कोशिश कर रहा हूं जहां डेटा int [] सरणी में प्रदर्शित होता है। विकिपीडिया पर बुलबुला तरह का एक उदाहरण:कैनवास रीफ्रेश कैसे करें

Bubble sort from wikipedia

मेरे छँटाई एल्गोरिदम सभी उठाना एक घटना ItemsSwapped जब पूर्णांक [] सरणी में दो आइटम लगा दिया जाता था।

// 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); 
} 

समस्या है, कि कैनवास खुद को ताज़ा नहीं है, यह सिर्फ कुछ समय के बाद अंतिम समाधान प्रदर्शित करता है: मैं कैनवास पर हर घटना के बाद डेटा प्रदर्शित करने के कोशिश कर रहा हूँ, यह मेरा कोड है। प्रत्येक उठाए गए कार्यक्रम के बाद मैं इसे कैसे रीफ्रेश कर सकता हूं?

संपादित करें - मैंने UpdateLayout, InvalidateMeasure और Dispatcher ऑब्जेक्ट के साथ प्रयास किया, लेकिन न तो काम किया।

उत्तर

2

शायद आप यूआई थ्रेड पर अपना सॉर्ट एल्गोरिदम शुरू करें, इसलिए यह समाप्त होने तक अपडेट नहीं होगा। Invoke या BeginInvoke पर कॉल करके, Dispatcher का उपयोग करके कैनवास बच्चों को किसी अन्य थ्रेड में सॉर्ट करने का प्रयास करें।

अपने ItemsSwapped हैंडलर एक अलग थ्रेड से कहा जाता है, तो यह कुछ ऐसा दिखाई देगा:

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

आप धागे का उपयोग कर रहे हैं? आपको मुख्य यूआई से अलग थ्रेड में अपना काम करना होगा। शुरू करने के लिए यहां एक लिंक दिया गया है: How to update the GUI from another thread in C#?

संबंधित मुद्दे