我有一個Silverlight應用程序,它有一個畫布。 在該Canvas上,我動態地「繪製」了一堆東西,但是將控件添加到畫布上。Silverlight:強制Canvas無效或重繪本身?
我有一個Canvas區域之外的按鈕,用於清除內容。 對象被刪除(成功)。但是,Canvas區域不會立即刷新;它目前需要MouseOver或Canvas自身的其他事件。
讓外部對象使Canvas無效的最簡單方法是什麼?我相信我錯過了一些簡單的東西!
我有一個Silverlight應用程序,它有一個畫布。 在該Canvas上,我動態地「繪製」了一堆東西,但是將控件添加到畫布上。Silverlight:強制Canvas無效或重繪本身?
我有一個Canvas區域之外的按鈕,用於清除內容。 對象被刪除(成功)。但是,Canvas區域不會立即刷新;它目前需要MouseOver或Canvas自身的其他事件。
讓外部對象使Canvas無效的最簡單方法是什麼?我相信我錯過了一些簡單的東西!
這是一個有點髒兮兮的,但你可以嘗試畫布的改變的知名度,爲「Visible」(即使它已經是),那麼:
myCanvas.Visibility = Visibility.Visible;
我們發現,這股勢力的重繪,即使myCanvas.Visible的實際值沒有變化...
給它一個去,它只是一個班輪,可能會修復的東西。儘管如此,我希望Canvas能夠重新繪製,如果你從中刪除東西。
萬一事後有人走來,像我一樣在尋找這個答案...
yourFrameworkElement.InvalidateArrange();
yourFrameworkElement.UpdateLayout();
爲我工作。
注意:只打電話this.yourFrameworkElement.UpdateLayout();
沒有不是爲我工作。我不得不打電話InvalidateArrange()
。我在此後立即撥打UpdateLayout()
以獲得完整性 - 可能沒有實際影響。
另外,myCanvas.Visibility = Visibility.Visible;
技巧不適用於我,因爲我試圖讓LayoutUpdated事件觸發。
沒有導致我重繪。這似乎不是這個問題的解決方案。 – Brett 2012-05-30 04:02:30
不是一個簡單的單線程,但它的工作原理。根據我的經驗,它效果很好。它將給定的動作延遲十分之一秒以允許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.
});
在我的情況(我有一個畫布內的畫布,我需要調整內部畫布由於方向變化),則myCanvas.Visibility = Visibility.Visible;
招沒這樣做,但它真的很接近:
myCanvas.Visibility = Visibility.Collapsed;
myCanvas.Visibility = Visibility.Visible;
工作得很好。
InvalidateArrange
後跟UpdateLayout
也沒有這樣做。
最後,所有這些都沒有必要,因爲我意識到Canvas裏面的Canvas不是必需的,並且能夠更改StackPanel的內部Canvas,並且不需要任何技巧就可以按預期工作。
不知何故,我的問題解決了。但是,這個答案非常好,因爲它的影響力非常低。作爲防禦措施,我可能會將此添加到我的代碼中。 – pearcewg 2009-02-02 14:23:42