2012-07-05 53 views
0

时,这里是我的问题代码:延迟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添加项目之前更改矩形的颜色?

我没有线索。

回答

1

UpdateLayout如果布局没有改变,那么这是你的情况。

你需要拨打的是InvalidateVisual。但这不是一个很好的做法。 我宁愿改变填写MouseLeftButtonDown事件。

XAML:

<Button MouseLeftButtonDown="PreviewChangeRectangle" ...> 

C#:

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

我无法为我的按钮找到'PreviewMouseDown'事件。也没有'Rectangle1.InvalidateVisual'。我究竟做错了什么? :( – Stacksatty 2012-07-05 13:41:54

+0

看到我的更新对不起,这是Windows手机:) – MBen 2012-07-05 13:45:26

+0

谢谢!是的,我注意到了。 ;) 当我使用'MouseLeftButtonDown'事件时,它不会改变颜色,但它适用于'GotFocus'事件。实际上,我想在用户点击按钮(GotFocus)后立即执行这两个操作,这在我的问题中没有提及。所以我需要两个单独的'GotFocus'事件来填充矩形,另一方面执行其他操作。对困惑感到抱歉! – Stacksatty 2012-07-05 14:01:19

0

添加到@ MBen的评论,我的理解是,虚拟树仅呈现一次全部处理完毕

可以酿出一个线程或者使用线程池,然后调用dispater来填充矩形,然后在for循环中使用调度器来添加文本框。

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