4

每个FrameworkElement都有一个Loaded事件,当......

树不仅被构建和初始化,而且布局已经在其上运行,数据已经绑定,它连接到渲染表面(窗口),并且您即将被渲染。当我们到达那个点时,我们通过广播 Loaded 事件来绘制树,从根开始。此事件对应于 IsLoaded 属性。

当树段/元素在屏幕外虚拟化、出现在屏幕上、一次又一次地跑出屏幕并稍后再次出现时,它们的预期行为是什么?

我希望该事件不会触发两次,因此不会再次出现在屏幕上,但是我不清楚第一次触发的时间。

卢克

4

2 回答 2

2

好吧,这很奇怪,可能是线程问题正在停止我的调试器写入输出(?),但是我用来对元素应用随机抖动的附加属性在滚动时一次又一次地触发,因此每次都会调用加载的事件。

Anatoliy 在评论中回答,所以我会请他发布答案并领取他的奖品。

于 2013-07-25T21:39:07.563 回答
1

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

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

从好的来源引用关于CanContentScroll

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

即使在 property 的情况下Visibility,也就是:

Visibility.Collapsed -> Visibility.Visible

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

我想,这个事件应该用于只渲染一次的静态控件,比如程序启动的时候。

于 2013-07-26T04:30:34.343 回答