0

这是我的问题的代码:

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 添加项目之前更改它的颜色呢?

我没有头绪。

4

3 回答 3

1

UpdateLayout如果布局没有改变,则无效,这是您的情况。

您需要调用的是InvalidateVisual. 然而,这不是一个很好的做法。我宁愿更改 Fill inMouseLeftButtonDown事件。

XAML:

 <Button MouseLeftButtonDown="PreviewChangeRectangle" ...>

C# :

private void PreviewChangeRectangle(object sender, RoutedEventArgs e)
{
 Rectangle1.Fill = color;
}
于 2012-07-05T13:35:52.647 回答
0

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

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

于 2012-07-05T13:40:11.990 回答
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" });
    }
}
于 2017-06-10T07:48:00.347 回答