9

データがint[]配列で表されるソートアルゴリズムの視覚的表現を作成しようとしています。ウィキペディアでのバブルソートの例:

ウィキペディアからのバブルソート

私の並べ替えアルゴリズムはすべて、int []配列内の2つのアイテムがスワップされると、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オブジェクトを試してみましたが、どちらも機能しませんでした。

4

2 に答える 2

2

たぶん、UIスレッドでソートアルゴリズムを開始するので、終了するまで更新されません。別のスレッドで並べ替えて、Dispatcherを使用してInvokeまたはBeginInvokeを呼び出してCanvasの子を更新してみてください。

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]);
            }
        }));
}
于 2013-03-24T20:44:32.073 に答える
2

スレッドを使用していますか?メインUIとは別のスレッドで作業を行う必要があります。開始するためのリンクは次のとおりです。C#の別のスレッドからGUIを更新する方法は?

于 2013-03-24T20:45:27.047 に答える