0

我有一个大尺寸的 Canvas 和许多小的用户控件。一次只有一小部分画布在屏幕上可见。用户控件由绑定到 ViewModel 的数据的 ItemsControl 创建。

<Canvas Height="10000" Width="10000" Background="White" >
    <ItemsControl ItemsSource="{Binding Path=MyData}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Views:MyControl />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="ContentPresenter">
                <Setter Property="Canvas.Left" Value="{Binding Left}"/>
                <Setter Property="Canvas.Top" Value="{Binding Top}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</Canvas>

现在由于用户控件的数量很大,加载整个画布需要很长时间。我只想加载当前可见框架中的那些控件。如果我移动画布,则应加载新可见区域下的用户控件。我想这样做的主要原因是与加载大量用户控件相关的性能滞后。我想在 Canvas 中完成 VirtualizingStackPanel 对 StackPanel 所做的事情。

有没有办法做到这一点?

谢谢您的帮助

4

2 回答 2

0

首先,测试加载空白用户控件。那是什么都不显示的用户控件。如果这足够快,它告诉我们问题不在于处理大量用户控件的画布,而在于初始化用户控件。

因此,如果是这种情况,请创建一个简单的占位符用户控件,在 IsVisibleChanged 事件触发时,它会使用自身作为画布加载目标用户控件。

一切都取决于第一次测试。

于 2012-01-28T05:11:44.043 回答
0

研究虚拟化。不要使用 Canvas,而是使用 ListBox 和您自己的VirtualizingPanel实现,它可以充当 Canvas 并且只会创建应该可见的控件。

UI 虚拟化有很多很棒的资源,这里有两个快速选择:

于 2012-02-07T14:14:01.447 回答