2012-07-05 37 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" }); 
    } 
}