向StackPanel添加项目时,UI更新延迟

时间:2012-07-05 13:26:06

标签: windows-phone-7 user-interface

以下是我的问题的代码:

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之前更改矩形的颜色?

我没有线索。

3 个答案:

答案 0 :(得分:1)

如果布局没有改变,

UpdateLayout无效,这是你的情况。

您需要致电InvalidateVisual。然而,这不是一个很好的做法。 我宁愿改变填充MouseLeftButtonDown事件。

XAML:

 <Button MouseLeftButtonDown="PreviewChangeRectangle" ...>

C#:

private void PreviewChangeRectangle(object sender, RoutedEventArgs e)
{
 Rectangle1.Fill = color;
}

答案 1 :(得分:0)

要添加到@ MBen的评论,我的理解是,只有在所有处理完成后才会呈现虚拟树

你可以生成一个线程或使用线程池,然后调用dispater来填充矩形,然后在for循环中使用dispatcher来添加文本框。

答案 2 :(得分:0)

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