我有一个带有ItemsControl的Window,它将符号放在地图上。符号相当复杂(每个符号由几个UserControls组成)。
我有一些场景,每个场景在地图上放置一组唯一的符号。有一个下拉菜单允许用户在场景之间切换。
如果用户切换到场景A(有22个符号),则整个地图一次刷新。
如果用户切换到场景B(有39个符号),则地图似乎刷新两次。绘制符号的某些部分,然后在短暂的时间之后绘制符号的其余部分。最后,符号显示正确,但两阶段刷新非常尴尬,看起来不专业。 (就好像你试图在路线图上放置一堆汽车,而不是出现的汽车,首先是汽车车身出现,然后片刻之后,车轮和后视镜出现了。)
在尝试调试时,我想到了两种场景之间的不同之处,而且我唯一能想到的是符号的数量不同。 (特定属性的差异似乎都是随机的。)因此,我只使用场景B的前22个符号进行了测试。地图一次刷新。我多次增加符号数量,地图仍然一次更新。然而,当我达到38个符号时,地图再次分两个阶段更新。为了防止最后两个符号出现异常,我尝试跳过前两个符号然后抓住剩下的37个,但是地图再次更新了一次。最后,我尝试跳过第一个符号,然后抓住剩下的38个。现在又回到了两个阶段更新地图。
底线:如果ItemsControl尝试一次渲染38个或更多符号,则会分两个阶段发生,否则会发生在一个阶段。无论符号数是多少,我都希望地图能够在一个阶段刷新。
从我读到的关于WPF虚拟化的内容来看,我不认为这种行为符合虚拟化的要求,因为一旦渲染完成,所有符号都不会隐藏或出现在屏幕外。我的显示器足够大,没有活动的滚动条。
所以,我对我在这里遇到的事情感到十分困惑。任何想法都赞赏。
更新
我尝试将“可见性”设置为“隐藏”,然后执行更新,然后将“可见性”设置为“可见”。没有区别。地图仍然刷新到阶段。 (我也尝试过折叠而不是隐藏,但仍然无效。)
答案 0 :(得分:0)
你解释的东西似乎真的很神秘。 也许它可以是一个临时选项,您可以将所有重绘符号的不透明度设置为0,并将可见性设置为折叠或隐藏。
选择场景时,所有元素的可见性都会变为“可见”。 当最后一个符号调用IsVisibleChanged事件时,您将所有元素的不透明度设置为1.
我知道,这将是一个非常不专业和基本的解决方案,但这可能是(如果这样有效)一个快速修复您的问题,直到真正(或更多)专业解决方案将成立。
亲切的问候 Shounbourgh