每个FrameworkElement
都有一个Loaded
事件,在......时会触发。
树不仅已构建并初始化,而且已在其上运行布局, 数据已绑定,它连接到渲染表面(窗口), 而你正处于渲染的边缘。当我们到达那一点时, 我们通过广播Loaded事件来绘制树 根。此事件对应于IsLoaded属性。
当树段/元素在屏幕外虚拟化,在屏幕上显示,再次在屏幕上运行并再次出现时,它们的预期行为是什么?
我希望这个事件不会发射两次,所以不会再次出现在屏幕上,但第一次射击的时间对我来说并不清楚。
路
答案 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属性,则不会触发该事件。
我认为,此事件应该用于静态控件,这些控件仅在一次时呈现,例如程序启动时。