当SharedSizeGroup位于ItemsControl生成的项目内部时,SharedSizeGroup怪异的跳跃/闪烁

时间:2019-06-04 08:25:05

标签: c# wpf xaml

问题(在切换列表绑定到ItemsSource时发生-当具有SharedSizeGroup的行消失一会儿时):

very weird jumping

所以我有一个Grid和一个IsSharedSizeScope="True"。我正在构建的控件是日历/日程表控件。

我有一个TimeRuler控件,需要将其与标题对齐(下面的屏幕快照中的橙色矩形)。我为此使用SharedSizeGroup。问题是SharedSizeGroup位于ItemsControl的生成项目内部,这会引起一些奇怪的延迟,如在gif中可以看到的。

是否在 之后重新渲染它?ItemsContainerGenerator渲染第一个项目或完成加载?

引起问题的代码段

<!--  to even time ruler out  -->
<Grid
    Grid.Row="0"
    Grid.Column="0"
    Grid.ColumnSpan="2"
    Margin="0,-1,0,0">
    <Grid.RowDefinitions>
        <!-- both SuperHeader and LocationHeader are rendered later and this is causing this weird flickering/jumping -->
        <RowDefinition SharedSizeGroup="SuperHeader" />
        <RowDefinition SharedSizeGroup="LocationHeader" />
    </Grid.RowDefinitions>
</Grid>

视觉树或多或少:

visualtree

这可以通过使这些高度固定而不使用SharedSizeGroup来解决,但是它不再那么灵活...

或者确保ItemsControl永远不会为空,例如使用ObservableCollection,添加新项目,然后删除旧项目。这样,具有共享大小组的RowDefinition总是出现在可视树中...

真的很烦...我认为在这种情况下甚至不可能使用SharedSizeGroup。

1 个答案:

答案 0 :(得分:0)

替换绑定到ItemsSource的集合从未像我想要的那样快。两者都没有清除和添加项目。这导致所有内容重新渲染,并且速度很慢。

因为找不到更好的解决方案,所以我只添加(填充)日用品一次,然后使用items[i]语法替换它们。这样,您不必在每次要显示不同日期范围时都完全重新渲染UI。