【问题标题】:How to refresh canvas如何刷新画布
【发布时间】:2013-03-14 06:33:59
【问题描述】:

我正在尝试创建任何排序算法的可视化表示,其中数据以 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);
}

问题是,画布不会自行刷新,它只是在一段时间后显示最终解决方案。每次引发事件后如何刷新它?

编辑 - 我尝试了 UpdateLayout、InvalidateMeasure 和 Dispatcher 对象,但都没有成功。

【问题讨论】:

    标签: c# wpf canvas .net-4.0 refresh


    【解决方案1】:

    也许您在 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]);
                }
            }));
    }
    

    【讨论】:

      【解决方案2】:

      你在使用线程吗?您必须在与主 UI 不同的线程中完成工作。这是一个帮助您入门的链接:How to update the GUI from another thread in C#?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        • 2014-03-06
        相关资源
        最近更新 更多