如何优化 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 个项目。
到目前为止,我尝试通过以下方式解决问题:
在网格上尝试一些虚拟化选项
跳过将图像加载为 BitmapImage,而是仅使用路径中的 URI
网格使用固定大小
我确定问题与 lst169 中有关加载文件的代码无关,因为它只在启动时加载一次数据。使用 URI 而不是 BitmapImage 让我确信我获取图像的方法也没有问题。
这一切都回到了将 DataContext 设置为列表框控件。
执行此操作的正确方法是什么?
谢谢!
编辑:
澄清一下,因为我的 post 让很多用户感到困惑:
- 申请开始
- 资源数据加载到列表中(3个列表,不同图片)
- 一旦数据完全加载,我将一个完全加载的列表设置为 ListBox 的 DataContext
那是冻结发生的时候。
稍后用户可以通过单击按钮在图像之间切换。我也在这段时间切换了 DataContext。发生冻结。
所以 - 冻结不是由启动时加载资源引起的。这是由于当图像绑定到图像控件时,将列表框的 DataContext 设置为列表引起的。无论我是绑定 BitmapImage 类型还是使用绝对路径的 URI。
您是否尝试过将 Image-Binding 设置为 IsAsync = true
<Image Source="{Binding image, IsAsync=True}" Stretch="Fill" HorizontalAlignment="Center"/>
在 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 个项目。
到目前为止,我尝试通过以下方式解决问题:
在网格上尝试一些虚拟化选项
跳过将图像加载为 BitmapImage,而是仅使用路径中的 URI
网格使用固定大小
我确定问题与 lst169 中有关加载文件的代码无关,因为它只在启动时加载一次数据。使用 URI 而不是 BitmapImage 让我确信我获取图像的方法也没有问题。
这一切都回到了将 DataContext 设置为列表框控件。
执行此操作的正确方法是什么?
谢谢!
编辑:
澄清一下,因为我的 post 让很多用户感到困惑:
- 申请开始
- 资源数据加载到列表中(3个列表,不同图片)
- 一旦数据完全加载,我将一个完全加载的列表设置为 ListBox 的 DataContext
那是冻结发生的时候。
稍后用户可以通过单击按钮在图像之间切换。我也在这段时间切换了 DataContext。发生冻结。
所以 - 冻结不是由启动时加载资源引起的。这是由于当图像绑定到图像控件时,将列表框的 DataContext 设置为列表引起的。无论我是绑定 BitmapImage 类型还是使用绝对路径的 URI。
您是否尝试过将 Image-Binding 设置为 IsAsync = true
<Image Source="{Binding image, IsAsync=True}" Stretch="Fill" HorizontalAlignment="Center"/>