我正在尝试创建任何排序算法的可视化表示,其中数据在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对象,但都没有工作。
答案 0 :(得分:2)
也许您在UI线程上启动排序算法,因此在完成之前不会更新。尝试在另一个线程中进行排序,并使用Dispatcher更新Canvas子项,方法是调用Invoke或BeginInvoke。
如果从单独的线程调用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]);
}
}));
}
答案 1 :(得分:2)
你在使用线程吗?您必须在与主UI不同的线程中完成工作。这是一个帮助您入门的链接:How to update the GUI from another thread in C#?