这是我问题的代码:
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" });
}
}
当然,将文本块添加到堆栈面板需要一些时间。但由于某种原因,矩形的布局与 StackPanel 同时更新。我尝试通过强制矩形更新来解决此问题
Rectangle1.UpdateLayout();
在将文本块添加到堆栈面板之前。但这也没有用。那么,在矩形开始向 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" });
}
}