[英]WPF: Updating Polyline's Points property via binding causes lag
我有一個自定義圖形控件,該控件使用Polyline
對象渲染波形。
<Polyline Name="Line" Points="{Binding LinePoints}"
Stroke="{Binding LineColor}"
StrokeThickness="{Binding LineThickness}">
在我的ViewModel中,每隔一小段時間(50-200毫秒),我就會通過DispatcherTimer
生成不同的“ LinePoints”集。 綁定工作得非常好,我在視圖上獲得了動畫波形,除了它在用戶界面中造成了明顯的滯后。 例如,當我右鍵單擊“窗口”中的其他內容時,上下文菜單將出現非常滯后的動畫。
當然,我可以將計時器更改為每500ms滴答一次,這樣可以大大減少延遲。 但是,這會使我的圖形顯得草率。 我有什么方法可以將其中一些轉移到另一個線程?
( LinePoints
說明: LinePoints
的生成不是滯后的主要原因。每一代都使用大約1毫秒的執行時間。該值從System.Diagnostics.Stopwatch
獲得)
因此,由於計算所有必需點的操作在UI上很繁瑣,因此您應該使用其他Thread
來進行計算。 UI Thread
應僅負責表示形式,這意味着它應僅分配給定值,而不計算值。
這是4.5
框架版本中引入的新的await async keywords
理想用例。
為了實現描述的行為,我建議像這樣使用Task class
:
private async void InvokeHandler()
{
while(true)
{
// Passes variable to calculation method and waits for result without blocking.
ViewModel.Points = await Task.Run(() => CalculatePoints(new object()));
await Task.Delay(100);
}
}
private Task<PointCollection> CalculatePoints(object requiredArguments)
{
var points = new PointCollection();
// Do calculations here with requiredArgument passed from a caller.
return Task.FromResult(points);
}
它是如何工作的? 在InvokeHandler
方法中,您將啟動一個Task
,該Task
本質上可能是另一個Thread
(如果當前Thread
沒有足夠的資源來運行提供的Delegate
,則從ThreadPool
收集),它將不會阻塞您當前正在運行的Thread
並且在執行完之后將返回一個結果( PointCollection
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.