FrameworkElement.Loaded事件如何与虚拟化一起工作?

时间:2013-07-16 13:10:09

标签: wpf silverlight xaml winrt-xaml

每个FrameworkElement都有一个Loaded事件,在......时会触发。

  

树不仅已构建并初始化,而且已在其上运行布局,   数据已绑定,它连接到渲染表面(窗口),   而你正处于渲染的边缘。当我们到达那一点时,   我们通过广播Loaded事件来绘制树   根。此事件对应于IsLoaded属性。

当树段/元素在屏幕外虚拟化,在屏幕上显示,再次在屏幕上运行并再次出现时,它们的预期行为是什么?

我希望这个事件不会发射两次,所以不会再次出现在屏幕上,但第一次射击的时间对我来说并不清楚。

2 个答案:

答案 0 :(得分:2)

嗯,这很奇怪,可能是一个线程问题就是停止我的调试器写输出(?)但是我用来将一个随机jilt应用于元素的连接属性在滚动时一次又一次地触发,所以每次调用加载的事件时间。

Anatoliy在评论中回答,所以我会请他发一个答案并收集他的奖品。

答案 1 :(得分:1)

在回答中转换注释:据我所知,每次滚动列表时,事件FrameworkElement.Loaded都会触发。例如 - ListBox。 我尝试应用动画来加载ListBox中的新元素,但每次滚动时都会触发该事件。一切都是这样,因为:

但是默认设置ScrollViewer.CanContentScroll设置为true,这意味着当您滚动浏览每个项目时会重新创建。这样做是为了改善大型列表中大量元素的加载。如果它设置为false,那么一旦所有元素都加载到内存中,如果有很多元素,这会影响性能。事件FrameworkElement.Loaded只会触发一次(至少它应该是一个小ListBox的测试)。

从好消息来源引用CanContentScroll

  

ScrollViewer目前允许两种滚动模式:平滑的逐像素滚动(CanContentScroll = false)或逐项逐项滚动(CanContentScroll = true)。目前,WPF仅在按项目滚动时支持UI虚拟化。基于像素的滚动也称为“物理滚动”,基于项目的滚动也称为“逻辑滚动”。

即使属性Visibility,也就是:

Visibility.Collapsed -> Visibility.Visible

事件FrameworkElement.Loaded仅在第一次转换可见性时调用。如果您稍后更改了visibility属性,则不会触发该事件。

我认为,此事件应该用于静态控件,这些控件仅在一次时呈现,例如程序启动时。