延迟UI更新添加项目的StackPanel
问题描述:
时,这里是我的问题代码:延迟UI更新添加项目的StackPanel
private void button1_Click(object sender, RoutedEventArgs e)
{
Rectangle1.Fill = color;
for (int i = 0; i < 1000; i++)
{
StackPanel1.Children.Add(new TextBlock() { Text = "TestBlock" });
}
}
当然这需要一些时间的TextBlocks添加到StackPanel中。但由于某种原因,矩形的布局与StackPanel同时更新。我试图通过强制矩形更新与
Rectangle1.UpdateLayout();
TextBlocks添加到StackPanel之前解决此问题。但是这也行不通。那么如何在开始向StackPanel添加项目之前更改矩形的颜色?
我没有线索。
答
UpdateLayout
如果布局没有改变,那么这是你的情况。
你需要拨打的是InvalidateVisual
。但这不是一个很好的做法。 我宁愿改变填写MouseLeftButtonDown
事件。
XAML:
<Button MouseLeftButtonDown="PreviewChangeRectangle" ...>
C#:
private void PreviewChangeRectangle(object sender, RoutedEventArgs e)
{
Rectangle1.Fill = color;
}
答
添加到@ MBen的评论,我的理解是,虚拟树仅呈现一次全部处理完毕
可以酿出一个线程或者使用线程池,然后调用dispater来填充矩形,然后在for循环中使用调度器来添加文本框。
答
除非您屈服于消息泵,否则WPF不会绘制任何东西。最简单的方法是使用async/await。
private async void button1_Click(object sender, RoutedEventArgs e)
{
Rectangle1.Fill = color;
await Task.Yield();
for (int i = 0; i < 1000; i++)
{
StackPanel1.Children.Add(new TextBlock() { Text = "TestBlock" });
}
}
我无法为我的按钮找到'PreviewMouseDown'事件。也没有'Rectangle1.InvalidateVisual'。我究竟做错了什么? :( – Stacksatty 2012-07-05 13:41:54
看到我的更新对不起,这是Windows手机:) – MBen 2012-07-05 13:45:26
谢谢!是的,我注意到了。 ;) 当我使用'MouseLeftButtonDown'事件时,它不会改变颜色,但它适用于'GotFocus'事件。实际上,我想在用户点击按钮(GotFocus)后立即执行这两个操作,这在我的问题中没有提及。所以我需要两个单独的'GotFocus'事件来填充矩形,另一方面执行其他操作。对困惑感到抱歉! – Stacksatty 2012-07-05 14:01:19