以下是我的问题的代码:
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之前更改矩形的颜色?
我没有线索。
答案 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" });
}
}