如何优化 DataContext 冻结

How to optimize DataContext freeze

在 WPF 中将 DataContext 分配给列表框控件时,我似乎无法解决可怕的 UI 冻结问题。

我在 Window.Resources 中定义了 DataTemplate。 当应用程序启动时,我在列表中加载图像并对其进行排序,其中 ImageInfo 保存有关加载图像的各种信息,包括 URI 路径或 BitmapImage。

然而,问题不在于此,当我将此列表指定为 ListBox 控件的 DataContext 时,我遇到了巨大的冻结问题,我似乎无法解决。

 <DataTemplate>
        <Grid HorizontalAlignment="Left" Width="260" Height="360">
            <Border Padding="5" Margin="10" BorderBrush="Orange">
                <Image Source="{Binding image}" Stretch="Fill" HorizontalAlignment="Center"/>
            </Border>
            <Border Background="Black" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Opacity="0.70" Height="50" Margin="0,10,10,0"></Border>
            <StackPanel VerticalAlignment="Bottom" Orientation="Horizontal" HorizontalAlignment="Center">
               <!-- 3 buttons -->
            </StackPanel>
        </Grid>
    </DataTemplate>

<ItemsPanelTemplate>
        <UniformGrid Columns="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </ItemsPanelTemplate>

我这样分配 DataContext :

 lbGallery.DataContext = lst169;

列表包含超过 10 个项目。

到目前为止,我尝试通过以下方式解决问题:

我确定问题与 lst169 中有关加载文件的代码无关,因为它只在启动时加载一次数据。使用 URI 而不是 BitmapImage 让我确信我获取图像的方法也没有问题。

这一切都回到了将 DataContext 设置为列表框控件。

执行此操作的正确方法是什么?

谢谢!

编辑:

澄清一下,因为我的 post 让很多用户感到困惑:

  1. 申请开始
  2. 资源数据加载到列表中(3个列表,不同图片)
  3. 一旦数据完全加载,我将一个完全加载的列表设置为 ListBox 的 DataContext

那是冻结发生的时候。

稍后用户可以通过单击按钮在图像之间切换。我也在这段时间切换了 DataContext。发生冻结。

所以 - 冻结不是由启动时加载资源引起的。这是由于当图像绑定到图像控件时,将列表框的 DataContext 设置为列表引起的。无论我是绑定 BitmapImage 类型还是使用绝对路径的 URI。

您是否尝试过将 Image-Binding 设置为 IsAsync = true

<Image Source="{Binding image, IsAsync=True}" Stretch="Fill" HorizontalAlignment="Center"/>