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

Wpf 提高将图像加载到ComboBox的性能,wpf,image,data-binding,combobox,virtualization,Wpf,Image,Data Binding,Combobox,Virtualization,我使用WPF ComboBox填充国家列表,如下所示: 在ComboBox内部,我有一个VirtualzingStackPanel,其中包含一个图像和一个文本块: <ComboBox.ItemTemplate> <DataTemplate> <VirtualizingStackPanel Orientation="Horizontal"> &

我使用WPF ComboBox填充国家列表,如下所示:

在ComboBox内部,我有一个VirtualzingStackPanel,其中包含一个图像和一个文本块:

<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>
我使用一个简单的数据绑定转换器来检索我的标志文件


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

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

虚拟化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>
您可能还需要将一个或所有这些属性添加到标记中


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

虚拟化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>
您可能还需要将一个或所有这些属性添加到标记中


回收模式产生了巨大的影响。非常感谢。同意我的观点!谢谢回收模式产生了巨大的影响。非常感谢。同意我的观点!谢谢