gpt4 book ai didi

c# - 如何刷新 Canvas

转载 作者:可可西里 更新时间:2023-11-01 09:13:46 28 4
gpt4 key购买 nike

我正在尝试创建任何排序算法的可视化表示,其中数据以 int[] 数组表示。维基百科上冒泡排序的一个例子:

Bubble sort from wikipedia

当交换 int[] 数组中的两个项目时,我的排序算法都会引发一个事件 ItemsSwapped。我试图在 Canvas 上的每个事件后显示数据,这是我的代码:

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

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

编辑 - 我尝试使用 UpdateLayout、InvalidateMeasure 和 Dispatcher 对象,但均无效。

最佳答案

也许您在 UI 线程上启动排序算法,因此它在完成之前不会更新。尝试在另一个线程中排序并使用 Dispatcher 更新 Canvas 子级, 通过调用 InvokeBeginInvoke .

如果您的 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]);
}
}));
}

关于c# - 如何刷新 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603614/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com