如何刷新画布

sve*_*vit 10 c# wpf refresh canvas .net-4.0

我试图创建任何排序算法的可视化表示,其中数据在int []数组中表示.维基百科上的冒泡排序示例:

来自维基百科的冒泡排序

当交换int []数组中的两个项时,我的排序算法都会引发一个事件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);
}
Run Code Online (Sandbox Code Playgroud)

问题是,画布不会自行刷新,只是在一段时间后显示最终解决方案.如何在每次举办活动后刷新它?

编辑 - 我尝试使用UpdateLayout,InvalidateMeasure和Dispatcher对象,但都没有工作.

Vla*_*mir 2

也许您在 UI 线程上启动排序算法,因此在完成之前它不会更新。尝试在另一个线程中进行排序,并通过调用InvokeBeginInvoke使用Dispatcher更新 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]);
            }
        }));
}
Run Code Online (Sandbox Code Playgroud)