在可视树稳定后调度UI任务

时间:2013-10-08 11:50:51

标签: wpf xaml winrt-xaml silverlight-5.0

在基于XAML的应用程序中,我经常需要操作屏幕元素,调整大小或移动内容。这种情况通常出现在非常自定义的UI控件上。

加载和数据绑定等的时间可能会引起令人不快的时间问题。

传统上,我和我的同事通过“重新调度”工作到UI线程来解决这些问题,以便在依赖属性处于“最终”状态时运行。

有更好的方法吗?您发现哪些策略有效?

LayoutUpdated事件可能非常嘈杂,细粒度,并且取消注册需要放弃方法的Lambda,因此无法从外部逻辑访问封闭变量 - 它有点像'mare。

修改

我会给出一个切实的例子。在进行面部识别时,自定义控件会在脸部周围绘制轮廓,所以我们在这里谈论完全自定义的东西,XAML没有任何功能。

图像需要缩放和调整大小,并且路径和几何图形按比例缩放和调整大小以使其全部对齐。

当以编程方式更改元素的高度和宽度时,影响不会立竿见影,只有将UI线程放回XAML框架后,渲染子系统才会重新排列所有内容。

因此,依赖于更改值的逻辑需要在框架重新排列所有内容之后运行,因此这项工作需要稍后在UI线程上进行调度,因此需要调度。闻起来。

当必需数据尚不可用时,会调用许多事件和虚拟。有时,需要在数据到达(即属性改变通知)时完成工作,这通常不会触发XAML布局事件。在这种情况下,我们诉诸调度员黑客。

2 个答案:

答案 0 :(得分:0)

使用Loaded事件怎么样?:

Loaded += LoadedHandler;

...

private void LoadedHandler(object sender, RoutedEventArgs e)
{
    // Do something here when controls have loaded
}

答案 1 :(得分:0)

我发现在WPF中,这个依赖属性元数据参数的存在是为了帮助解决我正在讨论的问题。

FrameworkPropertyMetadataOptions.AffectsRender

在Windows应用商店应用程序中不存在枚举,大概是因为它的设计者认为InvalidateArrange方法是一种合适的替代方法。

可能,我们应该a)使我们的DP变更处理程序中的安排无效b)在多次通过中进行这些安排c)容忍两次传递之间的错误布局。

但是,使用lambdas和调度程序很好,因为计算中使用的变量可以从闭包内部引用。