提高将图像加载到 ComboBox 中的性能

eYe*_*eYe 1 data-binding wpf virtualization combobox image

我正在使用 WPF ComboBox 填充国家/地区列表,如下所示:

在此输入图像描述

在 ComboBox 内部,我有一个 VirtualizingStackPanel,其中包含图像和 TextBlock:

<ComboBox.ItemTemplate>
                <DataTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal">
                        <Image Width="30" Height="30" Margin="0" Source="{Binding code, Converter={StaticResource ImageComboBoxConverter}}" VerticalAlignment="Center"/>
                        <TextBlock Margin="5" Text="{Binding country_Text}"/>
                    </VirtualizingStackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
Run Code Online (Sandbox Code Playgroud)

我正在使用一个简单的数据绑定转换器来检索我的标志文件。

问题是,填充列表大约需要 3-4 秒的时间。我可以应用某种缓冲或缓存技术来加快图像加载速度吗?

Rac*_*hel 5

您需要虚拟化ComboBox.ItemsPanel,而不是.ItemTemplate。是ItemsPanel用于显示所有控件的面板,而 是ItemTemplate用于显示每个控件的面​​板。

Virtualized StackPanel 所做的只是不渲染不可见的项目。相反,它仅呈现可见项目(加上滚动缓冲区的一些额外内容),并且当您滚动时将替换每个项目后面的数据。所以用它来显示每个单独的项目是没有用的,你需要使用它作为面板来显示所有项目。

你的代码可能应该是这样的:

<ComboBox ItemsSource="{Binding Countries}">
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>

    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Image Width="30" Height="30" Margin="0" Source="{Binding code, Converter={StaticResource ImageComboBoxConverter}}" VerticalAlignment="Center"/>
                <TextBlock Margin="5" Text="{Binding country_Text}"/>
            </StackPanel >
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

您可能还需要将这些属性之一或全部添加到标记中<ComboBox>

<ComboBox VirtualizingStackPanel.IsVirtualizing="True"           
          VirtualizingStackPanel.VirtualizationMode="Recycling"
          ScrollViewer.CanContentScroll="True" ...>
Run Code Online (Sandbox Code Playgroud)