[英]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.