0

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

东西加载和数据绑定等的时间可能会引起恼人的时间问题。

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

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

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

编辑

我举一个具体的例子。进行面部识别时,自定义控件会在面部周围绘制轮廓,因此我们在这里讨论的是完全自定义的东西,XAML 没有开箱即用。

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

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

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

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

4

2 回答 2

0

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

FrameworkPropertyMetadataOptions.AffectsRender

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

可能,我们应该 a) 在我们的 DP 更改处理程序中使排列无效 b) 在多个通道中进行这些排列 c) 在通道之间容忍不正确的布局。

尽管如此,在调度程序中使用 lambdas 还是不错的,因为可以从闭包内部引用计算中使用的变量。

于 2013-10-09T09:15:30.653 回答
0

如何使用Loaded事件?:

Loaded += LoadedHandler;

...

private void LoadedHandler(object sender, RoutedEventArgs e)
{
    // Do something here when controls have loaded
}
于 2013-10-08T12:42:00.337 回答