2009-01-30 45 views
6

我有一個Silverlight應用程序,它有一個畫布。 在該Canvas上,我動態地「繪製」了一堆東西,但是將控件添加到畫布上。Silverlight:強制Canvas無效或重繪本身?

我有一個Canvas區域之外的按鈕,用於清除內容。 對象被刪除(成功)。但是,Canvas區域不會立即刷新;它目前需要MouseOver或Canvas自身的其他事件。

讓外部對象使Canvas無效的最簡單方法是什麼?我相信我錯過了一些簡單的東西!

回答

4

這是一個有點髒兮兮的,但你可以嘗試畫布的改變的知名度,爲「Visible」(即使它已經是),那麼:

myCanvas.Visibility = Visibility.Visible; 

我們發現,這股勢力的重繪,即使myCanvas.Visible的實際值沒有變化...

給它一個去,它只是一個班輪,可能會修復的東西。儘管如此,我希望Canvas能夠重新繪製,如果你從中刪除東西。

+0

不知何故,我的問題解決了。但是,這個答案非常好,因爲它的影響力非常低。作爲防禦措施,我可能會將此添加到我的代碼中。 – pearcewg 2009-02-02 14:23:42

1

萬一事後有人走來,像我一樣在尋找這個答案...

yourFrameworkElement.InvalidateArrange(); 
yourFrameworkElement.UpdateLayout(); 

爲我工作。

注意:只打電話this.yourFrameworkElement.UpdateLayout();沒有不是爲我工作。我不得不打電話InvalidateArrange()。我在此後立即撥打UpdateLayout()以獲得完整性 - 可能沒有實際影響。

另外,myCanvas.Visibility = Visibility.Visible;技巧不適用於我,因爲我試圖讓LayoutUpdated事件觸發。

+0

沒有導致我重繪。這似乎不是這個問題的解決方案。 – Brett 2012-05-30 04:02:30

1

不是一個簡單的單線程,但它的工作原理。根據我的經驗,它效果很好。它將給定的動作延遲十分之一秒以允許UI線程更新,但它仍然在UI線程上執行動作。

using System; 
using System.Windows.Threading; 

public static class MyTestClass 
{ 
    public static void Postpone(Action a_action) 
    { 
     TaggedDispatchTimer timer = new TaggedDispatchTimer(); 
     timer.Interval = TimeSpan.FromSeconds(0.1); 
     timer.Tick += OnDoPostponedAction; 
     timer.UserState = a_action; 
     timer.Start(); 
    } 

    private static void OnDoPostponedAction(object sender, EventArgs e) 
    { 
     TaggedDispatchTimer timer = sender as TaggedDispatchTimer; 
     timer.Stop(); 
     timer.Tick -= OnDoPostponedAction; 

     var action = timer.UserState as Action; 
     if (action != null) 
      action(); 
    } 
} 

public class TaggedDispatchTimer : DispatcherTimer 
{ 
    public Object UserState { get; set; } 

} 

下面是我如何使用它:

MyTestClass.Postpone(() => 
    { 
     // Do some bloody long operation. 
    }); 
0

在我的情況(我有一個畫布內的畫布,我需要調整內部畫布由於方向變化),則myCanvas.Visibility = Visibility.Visible;招沒這樣做,但它真的很接近:

myCanvas.Visibility = Visibility.Collapsed; 
myCanvas.Visibility = Visibility.Visible; 

工作得很好。

InvalidateArrange後跟UpdateLayout也沒有這樣做。

最後,所有這些都沒有必要,因爲我意識到Canvas裏面的Canvas不是必需的,並且能夠更改StackPanel的內部Canvas,並且不需要任何技巧就可以按預期工作。