将项目添加到堆栈面板时延迟 UI 更新



这是我问题的代码:

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

最新更新